mabrouk/permission-simple

一个用于处理简单结构的权限的Laravel包

dev-master 2022-04-23 04:39 UTC

This package is auto-updated.

Last update: 2024-09-23 09:42:08 UTC


README

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

目录

重要介绍

使用顺序

安装

根据项目需求进行配置

在所需模型上使用HasPermission特性

开箱即用的方法和属性

开箱即用的模型

开箱即用的路由

还有什么?

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

还有其他什么吗?

许可证

重要介绍

为了最大限度地利用此包的结果,请尝试遵循标准路由命名规则,以获得良好的权限命名,这些命名与您的模型命名非常匹配。

  • 在路由命名中避免使用动词,例如get_users和get_news,而是使用模型复数名称将非常适合这里,请相信我。

使用顺序

安装和修改配置后

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

安装

您可以使用composer安装此包。

composer install mabrouk/permission-simple

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

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

在此之后,您可以在同一kernel文件中的$middlewareGroups属性下的任何特定分组路由中接受它,例如在api组下,或者像使用大多数中间件一样在您的路由文件中的特定路由中使用它。

例如,将此应用于api组的第一种方法在开发过程中将更舒适,因为您在配置包配置以符合您的项目需求后不再需要考虑它。

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

根据项目需求进行配置

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

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

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

php artisan config:cache

在所需模型上使用HasPermission特性

现在您需要将Mabrouk\PermissionSimple\Traits\HasPermission.php特性添加到具有如“User”模型之类的角色等模型上。请勿忘记将此特性添加到在permission.php配置文件中roleable_models键下指定的所有模型中,并且请务必仔细阅读配置文件中的说明。

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

开箱即用的方法和属性

在上述方法中,在permissions.php配置文件中指定模型上使用Mabrouk\PermissionSimple\Traits\HasPermission.php特性后,您将拥有指定模型上的额外方法和属性。以下以User模型为例,看看方法的使用,如下所示

方法

  • $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->canAccess($subPermissionName) 您需要传递一个子权限名称给此方法,作为它唯一的参数,以便检查用户是否有此特定的子权限。

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

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

注意,这里User模型仅用作示例,您可以在将Mabrouk\PermissionSimple\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);

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

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

还有什么?

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

注意

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

php artisan permission:seed

现在您会发现配置文件中指定的project_full_permission_admins具有全部权限。

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

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

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

namespace Mabrouk\PermissionSimple\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\PermissionSimple\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\PermissionSimple\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),
        ];
    }
}
  • 子权限资源
<?php

namespace Mabrouk\PermissionSimple\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\PermissionSimple\Http\Resources;

use Mabrouk\PermissionSimple\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\PermissionSimple\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,
        ];
    }
}

还有其他什么吗?

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

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

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

许可证

Mabrouk/Permission 包是开源软件,许可协议为 MIT 许可