riteshjha / laravel-permission
Laravel基于角色和用户的权限
Requires
- php: ^7.3|^8.0
- laravel/framework: ^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- laravel/legacy-factories: ^1.0.4
- orchestra/testbench: ^6.0
- phpunit/phpunit: ^9.3
This package is auto-updated.
Last update: 2024-09-25 10:00:35 UTC
README
此包允许您使用角色和基于直接用户权限的权限,在数据库中管理用户权限。它处理两种能力(路由能力和字段能力)。
安装
-
使用Composer安装它
composer require riteshjha/laravel-permission
-
您可以使用以下命令发布迁移、视图、资产和配置文件:
php artisan vendor:publish --provider="Rkj\Permission\PermissionServiceProvider"
-
在您的 config/app.php 文件中添加服务提供者
'providers' => [ // ... Rkj\Permission\PermissionServiceProvider::class, ]; 'aliases' => [ //... 'Permission' => Rkj\Permission\Facades\Permission::class ];
-
此包发布了一个
config/permission.php
文件。检查此文件并根据您的需要更改(能力、角色和用户)模型名称和其他配置选项。 -
运行迁移:
php artisan migrate
配置
-
首先在
config/permission.php
中配置模型命名空间 -
将
UserHasRole
特性添加到您的 User 模型,并将RoleHasAbility
添加到 Role 模型。 -
所有希望包含在权限中的模型都应该实现
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)