Skip to content

RBAC 权限系统

CatchAdmin 专业版采用标准的 RBAC(基于角色的访问控制)权限模型,实现用户-角色-权限的多对多关联关系。如需深入了解 RBAC 权限机制,可参考这篇基于角色的访问控制文档。

基本约定

  • 超级管理员不受任何权限控制
  • 对于 RBAC 权限控制,GET 请求默认放行,不受权限限制

权限模块

CatchAdmin 专业版默认不启用权限模块和动态菜单功能。使用前需要先激活权限模块

php
php artisan catch:module:install permissions

TIP

开启之后如果没有权限菜单,可以刷新一下

中间件

权限模块提供专用的权限验证中间件,实现访问控制功能

php
class PermissionGate
{
    public function handle(Request $request, \Closure $next)
    {
        // GET 请求默认放行,不进行权限验证
        if ($request->isMethod('get')) {
            return $next($request);
        }

        /* @var User $user */
        $user = $request->user(getGuardName());

        // 验证用户权限,无权限时抛出异常
        if (! $user->can()) {
            throw new PermissionForbidden();
        }

        return $next($request);
    }
}

权限配置

了解中间件机制后,重点需要掌握权限的数据结构组成。前后端分离项目的权限配置相比传统渲染项目更为复杂,建议先熟悉 Vue 路由相关知识。在权限管理/菜单管理页面点击新增,可看到权限配置界面

pSl4dVP.pngCatchAdmin 将权限分为三种类型

  • 目录 目录仅仅就是一级菜单

  • 菜单 菜单就是主要的页面

  • 按钮 每个页面的操作,每个按钮都对应后端的控制的一个 action,这个非常重要

  • 路由 Path 对应前端 vue 路由的 path

  • 组件 对应前端 vue 路由的 component

    • 目录类型一般都是选择 Layout 组件
    • 菜单类型则是选择对应页面的组件

传统 Laravel 项目通过 Controller 实现页面和操作的权限控制。前后端分离项目中,页面渲染交由前端处理,但数据操作仍由后端控制,因此 RBAC 权限系统主要负责 API 访问控制。后端重点关注按钮类型权限,即对控制器 action 方法的访问控制。 因此需要为控制器的每个 action 操作配置相应的权限标识,实现精细化权限控制。

权限判断

CatchAdmin 专业版采用模块化架构,权限标识格式规范如下

module@controller@action

例如权限模块的角色列表操作,权限验证标识格式示例

php
Modules\permissions\Http\Controller\RolesController@index

当前用户是否有权限

php
// 验证当前用户是否具有指定权限
Auth::user()->can(string $permission = null);
  • permission 参数格式为 module@controller@action,例如 permissions@Roles@index

用户的权限

php
// 获取用户的所有权限列表
/*@var Model\Roles $user*/
$user->withPermissions()->permissions;

角色权限

php
/*@var Model\Roles $role*/
$role->getPermissions()