mabrouk/权限

一个用于处理自定义组权限的 Laravel 扩展包

1.7.2 2024-09-23 14:13 UTC

README

mabrouk/permission 是一个 Laravel API 扩展包,使用数据库方法处理项目管理员权限。

目录

重要介绍

使用顺序

安装

根据项目需求进行配置

在期望的模型上使用 HasPermission 特性

开箱即用的方法和属性

开箱即用的模型

开箱即用的路由

还有什么?

预期在请求响应中返回的模型 API 资源

还有其他吗?

许可协议

重要介绍

为了最大限度地利用此包的结果,请尝试遵循标准的路由命名规则,以便权限名称组织得很好,非常适合您的模型名称。

  • 在路由命名中避免使用动词,如 get_users 和 get_news,而是使用模型复数名称会更合适,相信我。

使用顺序

安装和修改配置后

  • 添加新路由(如果您还没有的话),配置文件中有一个基本 URL
  • 当您需要在新添加的路由上应用权限时,请运行命令 php artisan permission:seed
  • 在您的 API 文档中包含预定义的路由,这些路由控制权限组、角色和权限显示名称,以便前端开发人员可以从中实现。或者引导前端开发人员阅读预期在请求响应中返回的模型 API 资源部分

安装

您可以使用 composer 安装此包。

composer install mabrouk/permission

为了使一切正常工作,请将 PermissionOfficerMiddleware 添加到 app/Http/Kernel.php 类中 $routeMiddleware 属性的末尾

    protected $routeMiddleware = [
        // ...
        'permission-officer' => \Mabrouk\Permission\Http\Middleware\PermissionOfficerMiddleware::class,
    ];

之后,您可以在同一 kernel 文件中的 $middlewareGroups 属性下接受它,例如在 api 组下,或者您可以在您的路由文件中的特定路由上使用它,就像您之前使用的许多中间件一样。

例如,将第一个选项应用于 api 组会更舒适,因为您在配置包配置与您的项目需求后不再需要考虑它。

    protected $middlewareGroups = [
        'api' => [
            // ...
            'permission-officer',
        ],
    ];
  • 现在您需要运行以下 命令 以发布包迁移并将 permissions.php 配置文件发布到配置目录
php artisan permission:setup
  • 然后您需要运行以下 命令 以迁移包表
php artisan migrate

根据项目需求进行配置

配置文件有多个配置选项,并已包含足够的注释来描述每个键的含义以及如何使用。

您可以在 config/permissions.php 下访问它

修改 permissions.php 配置文件后,请勿忘记运行以下命令

php artisan config:cache

在期望的模型上使用 HasPermission 特性

现在您需要在具有角色(例如,“User”模型)等的模型上添加 Mabrouk\Permission\Traits\HasPermission.php 特性。不要忘记将此特性添加到在 permission.php 配置文件中指定为 roleable_models 键的所有模型中,并且不要忘记仔细阅读配置文件中的说明。

  • 安装和结构工作都已完成。现在我们需要了解如何使用它。

开箱即用的方法和属性

如上所述,在 permissions.php 配置文件中指定的模型上使用 Mabrouk\Permission\Traits\HasPermission.php 特性后,您将在指定的模型上获得额外的方法和属性。以用户模型为例,我们可以看到以下方法的用法:

方法

  • $user->roles() 这是一个关系方法,以及如何像Laravel的正常关系方法一样访问角色。请注意,这是一个多态关系,因此要获取反向关系 $role->users(),这里的 users() 方法将与在 permissions.php 配置文件下的 roleable_models 键中指定的模型键相同的名称。

  • $user->permissions() 这是一个关系方法,以及如何像Laravel的正常关系方法一样访问权限。

  • $user->subPermissions() 这是一个关系方法,以及如何像Laravel的正常关系方法一样访问子权限。

  • $user->takeRole($role) 您需要将一个角色对象传递给此方法,作为其唯一的参数,以便将角色分配给用户。

  • $user->leaveRole($role) 您需要将一个角色对象传递给此方法,作为其唯一的参数,以便从用户中取消分配角色。

  • $user->canAccess($subPermissionName) 您需要将一个子权限名称传递给此方法,作为其唯一的参数,以检查用户是否具有此特定子权限。

  • $user->leaveAllRoles() 此方法不接受任何参数,它只是断开与用户相关联的所有角色的连接。

  • User::HasPermissions($permissionsIds) 这是一个查询作用域方法,用于筛选具有特定权限的用户,您可以使用 ->get()->first() 或任何其他方法来检索结果,就像通常使用一样。

请注意,这里使用的是User模型作为示例,您可以在应用了 Mabrouk\Permission\Traits\HasPermission.php 特性之后,使用 permissions.php 配置文件中的任何指定模型来实现相同的功能。

属性

  • $user->roles 返回用户分配的角色集合。

  • $user->permissions 返回用户分配的权限集合。

  • $user->subPermissions 返回用户分配的子权限集合。

  • $user->SubPermissionsNames 返回用户分配的子权限全名的数组。

开箱即用的模型

我们处理了4个基本模型

  • PermissionGroup 具有完整的 CRUD 功能以及可翻译的名称
  • Permission ==> 仅索引、显示和更新可翻译的描述和显示名称。它取决于您项目的模型名称。
  • SubPermission 没有单独的 CRUD 功能。通常它是(查看、创建、编辑、删除)之一。
  • Role 具有完整的 CRUD 功能以及可翻译的名称和描述

开箱即用的路由

让我们运行 route:list 命令来发现我们的包预定义的路由

php artisan route:list

实际上,我们将在以下路由的输出中找到您的项目当前路由的输出

Route::apiResource('permission-groups', PermissionGroupController::class);
Route::apiResource('permissions', PermissionController::class, ['except', ['store', 'destroy']]);
Route::apiResource('roles', RoleController::class);

显示、更新和销毁路由接受模型 id 作为 URL 中的模型段

如果上述路由不存在,您可能需要使用命令 php artisan route:clear 清除缓存的路由

还有什么?

您只需运行以下命令即可处理项目的权限,只需在添加了任何在 permissions.php 配置文件中定义的基础 URL 下指定的额外路由后运行此命令。

注意

您需要在配置文件中添加或修改与 base_urls 相关的任何路由后运行以下命令,以便添加或修改其适当的权限。

php artisan permission:seed

现在您将发现配置文件中指定的 project_full_permission_admins 具有完整的权限。

子权限将根据您的路由可用操作进行添加。例如,如果您指定了API资源路由的存储和销毁操作,它将相应地影响添加的子权限,否则它将为超级管理员用户添加4个操作,以便根据他正在修改的具体角色进行操作。

预期在请求响应中返回的模型 API 资源

  • PermissionGroupResource 返回在所有权限组请求中(除索引外)
<?php

namespace Mabrouk\Permission\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class PermissionGroupResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'permissions' => PermissionResource::collection($this->permissions),
        ];
    }
}
  • PermissionGroupSimpleResource 返回权限组索引请求
<?php

namespace Mabrouk\Permission\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class PermissionGroupSimpleResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
        ];
    }
}
  • PermissionResource
<?php

namespace Mabrouk\Permission\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class PermissionResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->display_name,
            'selected' => $this->isSelected,
            'group' => new PermissionGroupSimpleResource($this->group),
            'sub_permissions' => SubPermissionResource::collection($this->subPermissions),
        ];
    }
}
  • SubPermissionResource
<?php

namespace Mabrouk\Permission\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class SubPermissionResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->display_name,
            'selected' => $this->isSelected,
        ];
    }
}
  • RoleResource ==> 在角色 CRUD 中使用(除索引外)
<?php

namespace Mabrouk\Permission\Http\Resources;

use Mabrouk\Permission\Models\PermissionGroup;
use Illuminate\Http\Resources\Json\JsonResource;

class RoleResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'permission_groups' => PermissionGroupResource::collection(PermissionGroup::all()),
        ];
    }
}
  • RoleSimpleResource ==> 仅在角色索引中使用
<?php

namespace Mabrouk\Permission\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class RoleSimpleResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'description' => $this->description,
        ];
    }
}

还有其他吗?

实际上还有一个需要知道的事情,就是这个包依赖于mabrouk/translatable包,以便动态处理任何选择的语言的翻译。

您需要在所提到的模型的更新请求中传递额外的输入“locale”,并且需要使用您应用程序的默认语言创建角色和权限组。为了以期望的语言获取角色/权限/权限组名称或描述,您需要向请求中传递额外的头“X-locale”。

“locale”和“X-locale”都接受类似于['en', 'ar', 'fr', ...]等值,具体取决于您在项目中支持的语言。

许可协议

Mabrouk/Permission包是开源软件,遵循MIT许可证