laravel-rbac是一个基于Laravel框架的扩展包。
该扩展包为Laravel框架提供了RBAC模型的实现,并且支持模型授权,比如对菜单,分类等模型的授权。
Permission模型为一对一多态模型,默认提供Action模型的授权管理,并根据路由文件自动生成Action模型的权限节点。如需扩展其他模型,新建模型后,添加Shiwuhao\Rbac\Models\Traits\PermissibleTrait即可,会自动同步模型节点到permissions表中。
Rbac | Laravel | PHP |
---|---|---|
1.3.x | > 8.x | > =8.x |
$ composer require shiwuhao/laravel-rbac -vvv
php artisan vendor:publish
会生成以下两个文件
config/rbac.php
database/create_rbac_tables.php
php artisan migrate
迁移后,将出现四个新表:
roles -- 角色表
actions -- 操作表
permissions -- 权限表
role_user -- 角色和用户之间的多对多关系表
role_permission -- 角色和权限之间的多对多关系表
创建角色模型 app/Models/Role.php,继承\Shiwuhao\Rbac\Models\Role
<?php
namespace App\Models;
class Role extends \Shiwuhao\Rbac\Models\Role
{
}
创建权限模型 app/Models/Permission.php,继承\Shiwuhao\Rbac\Models\Permission
<?php
namespace App\Models;
class Permission extends \Shiwuhao\Rbac\Models\Permission
{
}
创建操作模型 app/Models/Action.php,继承\Shiwuhao\Rbac\Models\Action
<?php
namespace App\Models;
class Action extends \Shiwuhao\Rbac\Models\Action
{
}
用户模型中 添加 UserTrait
<?php
namespace App\Models;
use Shiwuhao\Rbac\Models\Traits\UserTrait;
class User extends Authenticatable
{
use UserTrait; // 添加这个trait到你的User模型中
}
创建菜单模型 app/Models/Menu.php,使用 Shiwuhao\Rbac\Models\Traits\PermissibleTrait。Menu模型的增删改会自动同步到permissions表中。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Shiwuhao\Rbac\Models\Traits\PermissibleTrait;
class Menu extends Model
{
use PermissibleTrait;
}
Action和Permission为一对一多态模型,创建Action节点会自动同步到Permission模型
$action = new App\Models\Action();
$action->name= 'user:index';
$action->label= '用户列表';
$action->method= 'get';
$action->uri= 'backend/users';
$action->save();
基于当前路由批量生成Action权限节点,可在config/rbac.php配置文件中通过path,except_path指定路径
php artisan rbac:auto-generate-actions
$role = new App\Models\Role();
$role->name= 'Administrator';
$role->label= '超级管理员';
$role->remark= '备注';
$role->save();
$role = App\Models\Role::find(1);
// 绑定权限
$role->permissions()->sync([1, 2, 3, 4]); // 同步
$role->permissions()->attach(5);// 附加
$role->permissions()->detach(2);// 分离
// 绑定用户
$role->users()->sync([1, 2, 3, 4]);// 同步
$role->users()->attach(5);// 附加
$role->users()->detach(5);// 分离
$user = App\Models\User::find(1);
$user->roles;
$user->roles()->sync([1, 2, 3, 4]);// 同步
$user->roles()->attach(5);// 附加
$user->roles()->detach(5);// 分离
$user->permissions;
返回数据为Collection集合,转数组可直接使用->toArray()
$user->hasRole('admin');
$user->hasRole(['admin','test'],true);
$user->hasPermission('user:add');
$user->hasPermission($names = ['user:add','user:edit'],$checkColumn = 'name',$and = false);
在app/Http/Kernel.php文件中添加路由中间件
protected $routeMiddleware = [
'permission' => Shiwuhao\Rbac\Middleware\PermissionMiddleware,
];
添加后即可在路由中使用
Route::middleware('permission')->group(function () {
Route::prefix('backend')->group(function () {
Route::get('users', [UserController::class, 'index']);
});
});
MIT