lihq1403/think-rbac

thinkphp-rbac

安装: 342

依赖: 0

建议者: 0

安全: 0

星标: 4

关注者: 1

分支: 1

开放问题: 0

类型:think-extend

1.0.4 2020-06-09 11:17 UTC

This package is auto-updated.

Last update: 2024-09-09 20:11:50 UTC


README

基于mysql的thinkphp6 rbac权限控制系统

安装

1、首先使用composer安装

$ composer require lihq1403/think-rbac:^1.0

2、发布资源

$ php think lihq1403:rbac-publish

会在config目录下生成一个rbac.php的配置文件

    /**
     * 用户表,这是我的示例,要改成你们自己的
     * 用来做关联的,所以一定要有
     */
    'user_model' => \app\common\models\AdminUser::class,

    /**
     * 是否忽略未定义的权限
     */
    'skip_undefined_permission' => true,

    /**
     * 可以跳过权限验证的 模块-控制器-方法
     */
    'continue_list' => [
        'module' => ['admin'],
        'controller' => ['test'],
        'action' => ['test']
    ],

3、数据迁移

$ php think lihq1403:rbac-migrate

随后会发现数据库多了5张表,表字段具体内容可查看代码

rbac_role  角色 表
rbac_user_role 用户角色 中间表
rbac_permission_group 权限组 表
rbac_permission 权限规则 表
rbac_role_permission_group 角色权限组 中间表
rbac_log 请求日志 表

4、使用

在你需要使用权限的用户model里面,引入use RbacUser;

如
namespace app\common\model;

use think\Model;
use Lihq1403\ThinkRbac\traits\RbacUser;

class AdminUser extends Model
{
    /**
     * 超级管理员id,该id的管理员拥有最高权限
     */
    const SUPER_ADMINISTRATOR_ID = 1;

    use RBACUser;
}

这样就可以开始使用了

直接使用

提供了controller,只需要定义路由,例如

// rbac 管理
Route::group('rbac', function () {

    // 角色管理
    Route::post('role', 'Lihq1403\ThinkRbac\controller\RBACController@addRole'); // 添加角色
    Route::put('role', 'Lihq1403\ThinkRbac\controller\RBACController@editRole'); // 修改角色
    Route::delete('role', 'Lihq1403\ThinkRbac\controller\RBACController@delRole'); // 删除角色
    Route::get('roles', 'Lihq1403\ThinkRbac\controller\RBACController@getRoles'); // 角色列表
    Route::get('role/permission-group', 'Lihq1403\ThinkRbac\controller\RBACController@roleHoldPermissionGroup'); // 角色拥有的权限列表
    Route::post('role/change-permission-group', 'Lihq1403\ThinkRbac\controller\RBACController@diffPermissionGroup'); // 角色更换的权限列表

    // 权限组管理
    Route::post('permission_group', 'Lihq1403\ThinkRbac\controller\RBACController@addPermissionGroup'); // 权限组新增
    Route::put('permission_group', 'Lihq1403\ThinkRbac\controller\RBACController@editPermissionGroup'); // 权限组编辑
    Route::delete('permission_group', 'Lihq1403\ThinkRbac\controller\RBACController@delPermissionGroup');// 权限组删除
    Route::get('permission_groups', 'Lihq1403\ThinkRbac\controller\RBACController@getPermissionGroups'); // 权限组列表

    // 权限管理
    Route::post('permission', 'Lihq1403\ThinkRbac\controller\RBACController@addPermission'); // 权限新增
    Route::put('permission', 'Lihq1403\ThinkRbac\controller\RBACController@editPermission'); // 权限编辑
    Route::delete('permission', 'Lihq1403\ThinkRbac\controller\RBACController@delPermission'); // 权限删除
    Route::get('permissions', 'Lihq1403\ThinkRbac\controller\RBACController@getPermissions'); // 权限列表

    // 管理员管理
    Route::post('admin-user/role', 'Lihq1403\ThinkRbac\controller\RBACController@userAssignRoles'); // 给管理员分配角色
    Route::delete('admin-user/role', 'Lihq1403\ThinkRbac\controller\RBACController@userCancelRoles'); // 给管理员删除角色
    Route::post('admin-user/sync-role', 'Lihq1403\ThinkRbac\controller\RBACController@userSyncRoles'); // 同步管理员角色

    // 日志管理
    Route::get('logs', 'Lihq1403\ThinkRbac\controller\RBACController@getLog'); // 获取日志
});

自定义使用

实例化

$rbac = new Rbac();
// 或者使用门面
\Lihq1403\ThinkRbac\facade\RBAC::addPermissionGroup();

权限组

增加权限组
$rbac->addPermissionGroup('用户管理', 'user_manager', '用户管理权限组');
编辑权限组
$rbac->editPermission(1, ['name' => '用户列表111']);
删除权限组
$rbac->delPermission(1);

角色

添加角色
$rbac->addRole('用户管理的管理员', '描述');
编辑角色
$rbac->editRole(1, ['name' => '用户管理的管理员']);
删除角色
$rbac->delRole(1);
禁用角色
$rbac->closeRole(2);
获取所有角色,分页显示
$rbac->getRoles($map = [], $field = [], $page = 1, $page_rows = 10);

返回结果是分页的
array(3) {
  ["page"] => int(1)
  ["total"] => int(1)
  ["list"] => array(1) {
    [0] => array(6) {
      ["id"] => int(2)
      ["name"] => string(24) "用户管理的管理员"
      ["description"] => string(2) "11"
      ["create_time"] => string(19) "2019-06-27 14:02:34"
      ["update_time"] => string(19) "2019-06-27 14:02:34"
      ["status"] => int(0)
    }
  }
}
获取角色所有权限组,已拥有和未拥有
$rbac->roleHoldPermissionGroup(2);

返回结果
array(3) {
  [0] => array(5) {
    ["id"] => int(4)
    ["name"] => string(12) "用户管理"
    ["description"] => string(21) "用户管理权限组"
    ["code"] => string(12) "user_manager"
    ["hold"] => int(0) // 10否
  }
  [1] => array(5) {
    ["id"] => int(5)
    ["name"] => string(3) "111"
    ["description"] => string(0) ""
    ["code"] => string(2) "11"
    ["hold"] => int(0)
  }
  [2] => array(5) {
    ["id"] => int(6)
    ["name"] => string(12) "用户列表"
    ["description"] => string(0) ""
    ["code"] => string(2) "22"
    ["hold"] => int(1)
  }
}

角色-权限组

分配权限
$rbac->assignPermissionGroup(2, 'user_manager');
第二个参数不填,则添加所有权限组
收回权限
$rbac->cancelPermissionGroup(2,['user_manager']);
第二个参数不填,则收获所有权限组
修改角色权限,已有未被选择会被删除,未有已选择会新增
$rbac->diffPermissionGroup(2, [22]);

用户-角色

先查找用户
$user = AdminUser::get(1);
分配角色
$user->assignRoles([1,2,3]);
收回角色
$user->cancelRoles([1,2,3]);
差值分配角色
$user->diffRoles([1,2,3]);
用户所有角色
$user->allRoles();
返回结果
array(1) {
  [0] => array(3) {
    ["role_id"] => int(2)
    ["name"] => string(24) "用户管理的管理员"
    ["description"] => string(2) "11"
  }
}

权限检查 传入用户id,一般配合中间件使用

$rbac->can(1);

如果没有权限,会抛出Lihq1403\ThinkRbac\exception\ForbiddenException异常

例子

    /**
     * rbac中间件
     * @param Request $request
     * @param \Closure $next
     * @return mixed
     * @throws ForbiddenException
     */
    public function handle(Request $request, \Closure $next)
    {
        $uid = AdminAuth::uid();

        // 超级管理员不需要进行权限控制
        if ($uid !== AdminUser::SUPER_ADMINISTRATOR_ID) {
            // 检查权限
            try {
                RBAC::can($uid);
            } catch (\Lihq1403\ThinkRbac\exception\ForbiddenException $exception){
                throw new ForbiddenException($exception->getMessage());
            }
        }

        // 记录日志
        RBAC::log($uid);

        return $next($request);
    }

日志相关

保存日志
$rbac->log(1);

传入用户id记录
日志列表获取
$rbac->getLogList(1,10);

结果如下格式:
array(1) {
  ["page"] => int(1)
  ["total"] => int(1)
  ["list"] => array(1) {
    [0] => array(8) {
      ["id"] => int(3)
      ["user_id"] => int(1)
      ["method"] => string(3) "GET"
      ["path"] => string(16) "api/admin/noAuth"
      ["ip"] => string(12) "192.168.56.1"
      ["input"] => object(stdClass)#255 (1) {
        ["hhh"] => string(1) "2"
      }
      ["create_time"] => string(19) "2019-07-10 15:23:12"
      ["user"] => array(2) {
        ["id"] => int(1)
        ["username"] => string(5) "admin"
      }
    }
  }
}

贡献

你可以通过以下三种方式之一进行贡献

  1. 使用问题追踪器提交错误报告。
  2. 问题追踪器上回答问题或修复错误。
  3. 贡献新功能或更新wiki。

代码贡献过程并不十分正式。你只需确保遵循PSR-0、PSR-1和PSR-2编码规范。任何新的代码贡献都必须伴随适用的情况下的单元测试。

许可证

MIT