kettasoft / gatekeeper
一个轻量级且功能强大的Laravel权限和配置处理包
Requires
- php: ^8.0
Requires (Dev)
- laravel/framework: ^10
- mockery/mockery: 1.6.x-dev
- orchestra/testbench: ^8.0
- pestphp/pest: 2.x-dev
README
本包为Laravel应用程序提供了管理角色和权限的全面系统。它允许轻松创建和管理角色,将权限分配给特定角色,并根据用户分配的角色和权限控制对应用程序不同部分的使用。
安装
您可以使用composer安装此包
composer require kettasoft/gatekeeper
在Laravel 5.5中,服务提供者将自动注册。在框架的旧版本中,您必须安装服务提供者
// config/app.php 'providers' => [ ... Kettasoft\Gatekeeper\Providers\GatekeeperServiceProvider::class, ];
发布config/gatekeeper.php配置
php artisan vendor:publish --provider="Kettasoft\Gatekeeper\Providers\GatekeeperServiceProvider" --tag="config"
警告
如果此命令没有发布任何文件,则很可能Laratrust服务提供者尚未注册。尝试清除您的配置缓存
php artisan config:clear
运行设置命令
重要:在运行命令之前,请访问您的config/gatekeeper.php文件,并根据您的需求更改值。
php artisan gatekeeper:migrate
此命令将生成迁移,创建角色和权限模型
use Kettasoft\Gatekeeper\Contracts\GatekeeperInterface; use Kettasoft\Gatekeeper\Traits\Gatekeeper; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable implements GatekeeperInterface { use Gatekeeper; // ... }
导出自加载器
composer dump-autoload
运行迁移
php artisan migrate
角色与权限
设置事项
让我们先创建以下角色
$owner = Role::create([ 'name' => 'owner', 'display_name' => 'Project Owner', // optional 'description' => 'User is the owner of a given project', // optional ]); $admin = Role::create([ 'name' => 'admin', 'display_name' => 'User Administrator', // optional 'description' => 'User is allowed to manage and edit other users', // optional ]);
角色分配与移除
$user->addRole($admin); // parameter can be a Role object, array, id or the role string name // equivalent to $user->roles()->attach([$admin->id]); $user->addRoles([$admin, $owner]); // parameter can be a Role object, array, id or the role string name // equivalent to $user->roles()->attach([$admin->id, $owner->id]); $user->syncRoles([$admin->id, $owner->id]); // equivalent to $user->roles()->sync([$admin->id, $owner->id]); $user->syncRolesWithoutDetaching([$admin->id, $owner->id]); // equivalent to $user->roles()->syncWithoutDetaching([$admin->id, $owner->id]);
移除
$user->removeRole($admin); // parameter can be a Role object, array, id or the role string name // equivalent to $user->roles()->detach([$admin->id]); $user->removeRoles([$admin, $owner]); // parameter can be a Role object, array, id or the role string name // equivalent to $user->roles()->detach([$admin->id, $owner->id]);
用户权限分配与移除
您可以为用户分配单个权限,因此要执行此操作,您只需执行以下操作
分配
$user->givePermission(['admin-create', 'admin-delete']); // parameter can be a Permission object, array, id or the permission string name $user->syncPermissions([$editUser->id, $createPost->id]); // equivalent to $user->permissions()->sync([$editUser->id, createPost->id]); $user->syncPermissionsWithoutDetaching([$editUser, $createPost]); // parameter can be a Permission object, array or id // equivalent to $user->permissions()->syncWithoutDetaching([$createPost->id, $editUser->id]);
中间件
配置
中间件自动注册为角色、权限。如果您想更改或自定义它们,请访问您的config/gatekeeper.php并设置middleware.register值为false,然后在app/Http/Kernel.php中的routeMiddleware数组中添加以下内容
'role' => \Kettasoft\Gatekeeper\Middleware\Role::class, 'permission' => \Kettasoft\Gatekeeper\Middleware\Permission::class,
概念
您可以使用中间件根据权限、角色过滤路由和路由组
Route::group(['prefix' => 'admin', 'middleware' => ['role:admin']], function() { Route::get('/', 'AdminController@welcome'); Route::get('/manage', ['middleware' => ['permission:manage-admins'], 'uses' => 'AdminController@manageAdmins']); });
如果您使用管道符号,则它将执行OR操作
'middleware' => ['role:admin|root'] // $user->hasRole(['admin', 'root']); 'middleware' => ['permission:edit-post|edit-user'] // $user->hasRole(['edit-post', 'edit-user']);
要模拟AND功能,您可以这样做
'middleware' => ['role:owner|writer,require_all'] // $user->hasRole(['owner', 'writer'], true); 'middleware' => ['permission:edit-post|edit-user,require_all'] // $user->isAbleTo(['edit-post', 'edit-user'], true);
使用不同的守卫
如果您想使用不同的守卫进行用户检查,可以指定为选项
'middleware' => ['role:owner|writer,require_all|guard:api'] 'middleware' => ['permission:edit-post|edit-user,guard:some_new_guard']
中间件返回
中间件支持两种类型的返回值,以失败的情况。您可以在config/gatekeeper.php文件中配置返回类型和值。
中止
默认情况下,中间件使用403代码中止,但您可以更改gatekeeper.middleware.handlers.abort.code值来自定义它。
重定向
如果中间件检查失败,需要重定向,则需要将middleware.handling值更改为redirect,并将gatekeeper.middleware.handlers.redirect.url更改为您需要重定向的路由。保持此配置不变
'handling' => 'redirect', 'handlers' => [ 'abort' => [ 'code' => 403 ], 'redirect' => [ 'url' => '/home', // Change this to the route you need 'message' => [ // Key value message to be flashed into the session. 'key' => 'error', 'content' => '' // If the content is empty nothing will be flashed to the session. ] ] ]