主题
CatchAdmin 权限管理
基于 RBAC 模型的权限系统介绍
CatchAdmin 采用业界成熟的 RBAC
(基于角色的访问控制)权限模型,即用户一对多角色,角色一对多权限的设计。这种模式通过角色作为中间层,实现了灵活的权限分配和管理。
如果对 RBAC
权限模型需要深入了解,建议参考 Oracle 官方文档:基于角色的访问控制。
基本约定
- 超级管理员免检:超级管理员不受任何权限控制,拥有系统全部操作权限
- GET 请求放行:所有
GET
请求默认放行,不受权限限制(查询操作通常不涉及数据变更)
权限约定
权限模块
CatchAdmin 为保持系统轻量化,默认不开启权限模块和动态菜单功能。如果项目需要权限控制,第一步需要安装权限模块:
php
php artisan catch:module:install permissions
INFO
开启之后如果没有权限菜单,可以刷新一下
中间件
权限模块提供了权限控制的中间件,实现自动的权限验证:
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);
}
}
添加权限
权限配置是系统的核心功能。由于 CatchAdmin 采用前后端分离架构,权限配置相比传统项目略为复杂,需要同时考虑前端路由和后端 API 的权限控制。
建议先熟悉 Vue Router 的基本概念。配置入口:权限管理/菜单管理 → 新增:
CatchAdmin 将权限分为三种层级类型:
目录:构建导航结构的一级菜单容器,用于功能分组
菜单:对应具体的功能页面,关联前端路由组件
按钮:页面内的具体操作功能,每个按钮对应后端控制器的一个
action
方法(这是后端权限控制的关键)路由
Path
对应前端vue
路由的path
组件 对应前端
vue
路由的component
- 目录类型一般都是选择 Layout 组件
- 菜单类型则是选择对应页面的组件
前后端分离的权限控制特点:
传统 Laravel 项目中,页面和数据都由 PHP 控制。CatchAdmin 采用前后端分离后:
- 前端负责:页面渲染、菜单显示、路由跳转
- 后端负责:API 接口访问控制、数据操作权限
因此,CatchAdmin 的 RBAC 权限重点在于控制 API 访问。后端需要为每个控制器的 action
方法配置对应的权限,确保数据操作的安全性。
权限判断
基于 CatchAdmin 的模块化架构,权限标识采用统一格式:
module@controller@action // 模块名称@控制器名称@控制器方法名称
示例说明:权限模块的角色列表功能,位于权限模块(Permissions)的角色控制器(RolesController)的 index
方法,其权限标识为:
php
Modules\Permissions\Http\Controller\RolesController@index
权限验证失败排查:当遇到权限认证失败时,通常是权限配置问题。请检查数据库 permissions
表中的配置: 确认
module
和 permission_mark
字段是否符合 module@controller@action
的格式规则。
当前用户是否有权限
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()