riteshjha/laravel-permission

Laravel基于角色和用户的权限

v2.0.4 2024-06-25 09:02 UTC

This package is auto-updated.

Last update: 2024-09-25 10:00:35 UTC


README

Latest Version on Packagist Total Downloads Software License

此包允许您使用角色和基于直接用户权限的权限,在数据库中管理用户权限。它处理两种能力(路由能力和字段能力)。

安装

  1. 使用Composer安装它

    composer require riteshjha/laravel-permission    
    
  2. 您可以使用以下命令发布迁移、视图、资产和配置文件:

    php artisan vendor:publish --provider="Rkj\Permission\PermissionServiceProvider"
    
  3. 在您的 config/app.php 文件中添加服务提供者

    'providers' => [
        // ...
        Rkj\Permission\PermissionServiceProvider::class,
    ];
    
    'aliases' => [
        //...
        'Permission' => Rkj\Permission\Facades\Permission::class
    ];
    
  4. 此包发布了一个 config/permission.php 文件。检查此文件并根据您的需要更改(能力、角色和用户)模型名称和其他配置选项。

  5. 运行迁移:php artisan migrate

配置

  1. 首先在 config/permission.php 中配置模型命名空间

  2. UserHasRole 特性添加到您的 User 模型,并将 RoleHasAbility 添加到 Role 模型。

  3. 所有希望包含在权限中的模型都应该实现 Permissionable 接口并添加 HasPermission 特性。

能力

包处理两种能力(路由能力和字段能力)。包解析 Auth 路由(具有 auth 中间件的路由)并将路由名称存储为路由能力。对于字段能力,您必须在模型中定义它,如下所示

class Project extends Model
{
    protected $fieldAbilities = ['cost', 'estimated_cost'] ; //list projects table fields on which you want to apply permission
}

您可以在您的 seeder 中使用 Project::allowFieldAbilities(['cost']) 来允许默认字段能力。有关详细信息,请参阅测试中的 PermissionSeeder

角色和能力分组

角色和能力分为两组(SYSTEM 和 ACCOUNT)。所有管理行政任务的管理员用户都将属于 SYSTEM 组角色。所有注册或登录为前端用户的用户都将属于 ACCOUNT 组。同样,所有用于管理界面的能力(路由名称)都将属于 SYSTEM 组,而所有用于前端的能力都将属于 ACCOUNT 组。要禁用它,将 config 中的 disableAbilityGroup 更改为 true。

同步能力

php artisan ability:record  // if need fresh then add --fresh

管理界面

有一个带有路由和视图的管理界面来处理能力和权限。您必须将包路由添加到您的管理路由组中。

Route::group(['middleware' => ['auth'], 'prefix' => 'admin'], function () {
    Permission::routes();
});

现在您可以通过 admin/permission/roles 路由访问权限界面

注意:如果您使用除 'admin' 之外的其他管理路由前缀,则需要在 config/permission.php 中更改 adminRoutePrefix 的值。

用法

包使用laravel gate,因此您可以在视图中使用 can('project.create'),在控制器中使用 $this->authorize('project.create') 来处理路由能力。对于字段能力,您可以在视图中使用 can('projects::cost')。这里 projects 是一个表名。

有关详细信息,请参阅 测试

创建/更新

在模型中创建或更新记录时,使用 filterFieldAccess 方法过滤数据

$data = Project::filterFieldAccess($data)