菜单规则
XinAdmin 基于 Laravel Sanctum 实现用户认证与授权,应用中的每一个接口、菜单、页面和按钮都可以看作为 Sanctum 的一个 能力(abilities),通过 菜单规则 来控制访问权限。
核心特性
- 控制器注解路由权限验证 - 通过路由注解自动验证用户权限
- 动态菜单 - 根据用户角色动态生成菜单
- 页面按钮权限验证 - 基于用户权限控制页面元素显示
数据表结构
sys_rule - 规则表
存储系统所有权限规则,包括菜单、路由和按钮级别权限。
type 规则类型说明:
sys_role - 角色表
sys_role_rule - 角色权限中间表
权限类型详解
菜单类型(menu)
用于侧边栏菜单展示,对应系统菜单结构。
路由类型(route)
对应具体页面或功能,会生成实际路由规则并参与权限校验。
权限类型(rule)
用于细粒度权限控制,如页面内的按钮权限。
权限验证流程
后端权限验证
- 用户登录时,系统通过
SysUserService::ruleKeys()获取用户所有权限 key - 用户访问接口时,
authorize中间件验证请求是否具有对应权限 - 路由注解中的
authorize参数与权限 key 进行匹配
超级管理员
用户ID为1的账号为超级管理员,拥有所有权限。
动态菜单生成
后端实现
用户登录后调用 /system/user/menu 接口获取菜单数据:
获取用户菜单逻辑
前端菜单渲染
前端通过 useMenuStore 管理菜单状态:
菜单渲染时会过滤隐藏项:
权限中间件
abilities 中间件
验证用户是否具有特定权限能力:
authGuard 中间件
验证用户是否已认证:
菜单规则管理
管理页面功能
- 菜单列表:树形展示所有菜单规则
- 添加规则:支持添加菜单、路由、权限三种类型
- 编辑规则:修改规则信息
- 删除规则:删除规则(需确认)
- 设置显示状态:控制菜单是否在侧边栏显示
- 设置启用状态:控制规则是否生效
添加规则示例
添加顶级菜单:
添加子级路由:
添加按钮权限:
与注解路由的关联
菜单规则与注解路由配合使用,权限 key 的拼接规则:
菜单规则中的 key 字段需要与注解路由生成的权限 key 保持一致:
最佳实践
1. 权限 key 命名规范
建议采用 模块.资源.操作 的命名方式:
2. 角色权限分配
建议创建多个角色,每个角色分配不同的权限组合:
- 超级管理员:拥有所有权限
- 运营管理员:内容管理相关权限
- 普通管理员:基础查看权限
3. 按钮级权限控制
对于页面内的敏感操作(如删除、审核),使用 rule 类型权限: