kerigard / laravel-roles
Laravel的权限和角色
Requires
- php: ^8.0.2|^8.1
- laravel/framework: ^9.20|^10.0
Requires (Dev)
- orchestra/testbench: ^7.0|^8.0
- phpunit/phpunit: ^9.4
README
Laravel 9.20及以上版本的权限和角色。
安装
使用composer安装包
composer require kerigard/laravel-roles
使用vendor:publish artisan命令发布配置和迁移文件
php artisan vendor:publish --provider="Kerigard\LaravelRoles\RolesServiceProvider"
根据需求自定义roles.php配置文件。之后运行迁移
php artisan migrate
使用方法
连接特性
要开始使用权限和角色检查,您的User模型必须使用Kerigard\LaravelRoles\Traits\HasRoles和Kerigard\LaravelRoles\Traits\HasPermissions特性
use Kerigard\LaravelRoles\Traits\HasPermissions; use Kerigard\LaravelRoles\Traits\HasRoles; class User extends Authenticatable { use HasPermissions; use HasRoles; }
无需同时连接这两个特性。
创建角色和权限
创建角色和权限,然后创建它们之间的关系
use Kerigard\LaravelRoles\Models\Permission; use Kerigard\LaravelRoles\Models\Role; $role = Role::create(['name' => 'Manager', 'slug' => 'manager']); $permission = Permission::create(['name' => 'Edit articles', 'slug' => 'edit-articles']); $role->attachPermission($permission);
您可以通过配置文件覆盖模型。
将角色或权限连接到用户
$user->attachRole(1); $user->attachRole($adminRole); $user->attachRole('super-admin'); $user->attachRole([1, $adminRole, 'manager']); $user->attachPermission(1); $user->attachPermission($editPostsPermission); $user->attachPermission('edit-articles'); $user->attachPermission([1, $editPostsPermission, 'edit-articles']);
您可以为用户禁用角色或权限
$user->detachRole(1); $user->detachRole($adminRole); $user->detachRole('super-admin'); $user->detachRole([1, $adminRole, 'manager']); $user->detachAllRoles(); $user->detachPermission(1); $user->detachPermission($editPostsPermission); $user->detachPermission('edit-articles'); $user->detachPermission([1, $editPostsPermission, 'edit-articles']); $user->detachAllPermissions();
或者仅同步指定的角色或权限。未列出的角色或权限将被禁用
$user->syncRoles(1); $user->syncRoles($adminRole); $user->syncRoles('super-admin'); $user->syncRoles([1, $adminRole, 'manager']); $user->syncPermissions(1); $user->syncPermissions($editPostsPermission); $user->syncPermissions('edit-articles'); $user->syncPermissions([1, $editPostsPermission, 'edit-articles']);
如果不想在同步时禁用旧角色或权限,请使用此方法
$user->syncRolesWithoutDetaching($role); $user->syncPermissionsWithoutDetaching($permission);
权限检查
要检查权限,请运行
$user->hasPermission('edit-articles'); $user->hasPermission(1); $user->hasPermission($permission); // has all permissions $user->hasPermission(['edit-articles', 'register-articles']); // has any permissions $user->hasAnyPermission(['edit-articles', 'register-articles']); $user->doesNotHasPermission($permission); $user->doesNotHasAnyPermission(['edit-articles', 'register-articles']); // or check that the role contains the permission $role->hasPermission('edit-articles');
所有权限都已与Laravel Gates注册,因此您可以使用can函数
$user->can('edit-articles'); $user->can(['edit-articles', 'register-articles']); $user->canAny(['edit-articles', 'register-articles']);
在控制器中,您可以使用authorize函数,如果用户没有权限则抛出异常
class PostController extends Controller { public function index() { $this->authorize('view-posts'); return Post::all(); } }
角色检查
要检查是否存在角色,请运行
$user->hasRole('manager'); $user->hasRole(1); $user->hasRole($role); // has all roles $user->hasRole(['manager', 'admin']); // kas any roles $user->hasAnyRole(['manager', 'admin']); $user->doesNotHasRole($role); $user->doesNotHasAnyRole(['manager', 'admin']);
如果要在控制器中检查角色并在缺失时抛出异常,则需要替换app\Http\Controllers\Controller.php文件中的特性导入
// from use Illuminate\Foundation\Auth\Access\AuthorizesRequests; // to use Kerigard\LaravelRoles\Traits\AuthorizesRequests;
之后,您可以使用hasRole函数
class PostController extends Controller { public function index() { $this->authorizeRole('editor'); return Post::all(); } }
Blade指令
您可以在blade文件中使用指令方便地编写条件
@can('edit-articles') // @endcan @canany(['edit-articles', 'register-articles']) // @endcanany @is('manager') // @endis @isany(['manager', 'admin']) // @endisany
中间件
在app/Http/Kernel.php文件中,您可以指定用于检查角色和权限的中间件
protected $routeMiddleware = [ 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'is' => \Kerigard\LaravelRoles\Middlewares\AuthorizeRole::class, ];
然后您可以保护路由
Route::put('users', [UserController::class, 'update'])->middleware('can:edit-users'); // or Route::put('users', [UserController::class, 'update'])->can('edit-users'); Route::get('users', [UserController::class, 'index'])->middleware('is:admin'); // or Route::get('users', [UserController::class, 'index'])->is('admin');
自定义状态
默认情况下,Laravel在抛出异常时会返回一个403错误代码和消息This action is unauthorized。您可以为每个角色和权限指定自己的错误代码和消息
Role::create([ 'name' => 'Admin', 'slug' => 'admin', 'status' => 404, 'message' => 'Not found', ]); Permission::create([ 'name' => 'Edit users', 'slug' => 'edit-users', 'status' => 404, 'message' => 'Not found', ]);
超级管理员
在配置中,您可以选择启用超级管理员角色。具有此角色的用户,所有权限和角色检查都将为 true。
变更日志
请参阅 变更日志 了解最近有哪些变化。
许可证
MIT。请参阅 许可证文件 了解更多信息。