shiwuhao/laravel-rbac

A laravel Role-Based Access Control package

v1.4.1 2023-08-09 09:55 UTC

This package is auto-updated.

Last update: 2024-05-09 11:32:50 UTC


README

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快速安装扩展包

$ 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 -- 角色和权限之间的多对多关系表

模型

Role

创建角色模型 app/Models/Role.php,继承\Shiwuhao\Rbac\Models\Role

<?php

namespace App\Models;

class Role extends \Shiwuhao\Rbac\Models\Role
{

}

Permission

创建权限模型 app/Models/Permission.php,继承\Shiwuhao\Rbac\Models\Permission

<?php

namespace App\Models;

class Permission extends \Shiwuhao\Rbac\Models\Permission
{

}

Action

创建操作模型 app/Models/Action.php,继承\Shiwuhao\Rbac\Models\Action

<?php

namespace App\Models;

class Action extends \Shiwuhao\Rbac\Models\Action
{

}

User

用户模型中 添加 UserTrait

<?php

namespace App\Models;

use Shiwuhao\Rbac\Models\Traits\UserTrait;

class User extends Authenticatable
{
    use UserTrait; // 添加这个trait到你的User模型中
}

扩展模型授权,比如菜单 Menu

创建菜单模型 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 权限节点

Action和Permission为一对一多态模型,创建Action节点会自动同步到Permission模型

创建一个Action节点

$action = new App\Models\Action();
$action->name= 'user:index';
$action->label= '用户列表';
$action->method= 'get';
$action->uri= 'backend/users';
$action->save();

批量生成Action节点

基于当前路由批量生成Action权限节点,可在config/rbac.php配置文件中通过path,except_path指定路径

php artisan rbac:auto-generate-actions

Role 角色

创建一个角色

$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 用户

获取用户角色

$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);

Middleware

在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']);
    });
});

License

MIT