phpexperts/laravel-rbac

Laravel 5 的基于角色的访问控制

1.0.4 2018-12-20 02:46 UTC

This package is auto-updated.

Last update: 2024-08-26 23:54:20 UTC


README

为 Laravel 5 提供简单的 RBAC/ACL 实现。兼容 Laravel >=5.4 的 https://github.com/thelfensdrfer/laravel-rbac 分支。

安装

使用以下命令通过 composer (Packagist) 安装此包

composer require phpexperts/laravel-rbac

或修改你的 composer.json

"require": {
    ...
    "phpexperts/laravel-rbac": "^1.0"
}

然后运行 composer update

安装后,将 ServiceProvider 注册到 config/app.php 文件中的 providers 数组

PHPExperts\LaravelRBAC\RbacServiceProvider::class,

运行迁移

$ php artisan migrate

将 RBAC 中间件添加到你的 app/Http/Kernel.php

protected $routeMiddleware = [
    ...
    'rbac' => '\PHPExperts\LaravelRBAC\Middleware\Rbac::class'
];

将 Rbac 特性添加到你的 User 模型

use PHPExperts\LaravelRBAC\Traits\Rbac;
	
class User extends Authenticatable
{
    use HasRoles;
    ...
	    
}

使用方法

角色

创建角色

$adminRole = new Role;
$adminRole->name = 'Administrator';
$adminRole->slug = 'administrator';
$adminRole->description = 'System Administrator';
$adminRole->save();

$editorRole = new Role;
$editorRole->name = 'Editor';
$editorRole->slug = 'editor';
$editorRole->description = 'Editor';
$editorRole->save();

将角色分配给用户

$user = User::find(1);
$user->roles()->attach($adminRole->id);

你也可以一次分配多个角色

$user->roles()->attach([$adminRole->id, $editorRole->id]);

从用户撤销角色

$user->roles()->detach($adminRole->id);

你也可以一次撤销多个角色

$user->roles()->detach([$adminRole->id, $editorRole->id]);

同步角色

$user->roles()->sync([$editorRole->id]);

如果你不在同步方法中传递其 id,已分配给用户的任何角色都将被撤销。

权限

创建权限

$createUser = new Permission;
$createUser->name = 'Create user';
$createUser->slug = 'user.create';
$createUser->description = 'Permission to create user';
$createUser->save();

$updateUser = new Permission;
$updateUser->name = 'Update user';
$updateUser->slug = 'user.update';
$updateUser->description = 'Permission to update user';
$updateUser->save();

将权限分配给角色

$adminRole = Role::find(1);
$adminRole->permissions()->attach($createUser->id);

你也可以一次分配多个权限

$adminRole->permissions()->attach([$createUser->id, $updateUser->id]);

从角色撤销权限

$adminRole->permissions()->detach($createUser->id);

你也可以一次撤销多个权限

$adminRole->permissions()->detach([$createUser->id, $updateUser->id]);

同步权限

$adminRole->permissions()->sync([$updateUser->id]);

如果你不在同步方法中传递其 id,已分配给角色的任何权限都将被撤销。

检查用户角色/权限

可以使用 hasRolecanDo 方法在 User 实例上检查角色和权限。

$isAdmin = Auth::user()->hasRole('administrator'); // pass role slug as parameter
$isAdminOrEditor = Auth::user()->hasRole('administrator|editor'); // using OR operator
$canUpdateUser = Auth::user()->canDo('update.user'); // pass permission slug as parameter
$canUpdateOrCreateUser = Auth::user()->canDo('update.user|create.user'); // using OR operator

保护路由

Laravel RBAC 提供中间件来保护单个路由和路由组。中间件期望两个以逗号分隔的参数

  • iscan 作为第一个参数 - 要检查的内容(角色/权限)
  • 角色/权限别名作为第二个参数
Route::get('/backend', [
    'uses' => 'BackendController@index',
    'middleware' => ['auth', 'rbac:is,administrator']
]);
Route::get('/backend', [
    'uses' => 'BackendController@index',
    'middleware' => ['auth', 'rbac:is,administrator|editor']
]);
Route::get('/dashboard', [
    'uses' => 'DashboardController@index',
    'middleware' => ['auth', 'rbac:can,view.dashboard']
]);
Route::get('/dashboard', [
    'uses' => 'DashboardController@index',
    'middleware' => ['auth', 'rbac:can,view.dashboard|view.statistics']
]);

Blade 指令

Laravel RBAC 提供两个 Blade 指令来检查用户是否已分配角色/权限。

检查角色

@ifUserIs('administrator')
    // show admin content here
@else
    // sorry
@endif

@ifUserIs('administrator|editor')
    // show editor content here
@else
    // sorry
@endif

检查权限

@ifUserCan('delete.user')
    // show delete button
@endif

@ifUserCan('delete.user|manage.user')
    // show delete button
@endif

许可证

Laravel RBAC 是开源软件,受 MIT 许可证 的许可。