主题
Are you an LLM? You can read better optimized documentation at /server/permission.md for this page in Markdown format
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 路由相关知识。在权限管理/菜单管理页面点击新增,可看到权限配置界面
CatchAdmin
将权限分为三种类型
目录 目录仅仅就是一级菜单
菜单 菜单就是主要的页面
按钮 每个页面的操作,每个按钮都对应后端的控制的一个
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()