菜单与权限管理
2025-12-04 21:58 更新
菜单与权限管理
DoraCMS 提供了灵活的菜单和权限管理系统,支持细粒度的权限控制,帮助你构建安全的管理后台。
菜单管理概述
功能特点
- 层级菜单:支持多级菜单结构
- 权限绑定:菜单与权限关联
- 按钮权限:页面级按钮权限控制
- 动态加载:根据用户角色动态显示菜单
菜单结构
菜单层级
DoraCMS 支持多级菜单:
一级菜单(模块)
├── 二级菜单(功能)
│ ├── 三级菜单(子功能)
│ └── 按钮权限(操作)
└── 二级菜单(功能)
菜单配置
每个菜单项包含以下配置:
基本信息:
- 菜单名称:显示在界面上的名称
- 菜单图标:菜单前的图标(可选)
- 排序:菜单的显示顺序
- 是否启用:控制菜单是否显示
路由信息:
- 路由路径:前端路由地址
- 组件路径:对应的前端组件
权限信息:
- 权限代码:唯一的权限标识
- API 路径:关联的后端 API
创建菜单
创建一级菜单
- 进入"系统设置" → "菜单管理"
- 点击"新增菜单"
- 填写菜单信息
配置示例:
{
"name": "内容管理",
"icon": "file-text",
"sort": 1,
"enable": true,
"type": "module" // 模块类型
}
创建二级菜单
- 选择父级菜单
- 点击"添加子菜单"
- 填写菜单信息
配置示例:
{
"name": "文章管理",
"parentId": "parent_menu_id",
"path": "/content/article",
"component": "content/article/index",
"permissionCode": "content:article:view",
"api": "content/getList",
"sort": 1,
"enable": true
}
菜单类型
模块菜单(一级):
- 用于组织功能模块
- 通常不关联具体页面
- 只起到分组作用
功能菜单(二级/三级):
- 关联具体的功能页面
- 需要配置路由和组件
- 绑定权限代码
按钮权限
什么是按钮权限
按钮权限是页面级的操作权限,控制用户是否可以执行特定操作,如:
- 新增
- 编辑
- 删除
- 导出
- 审核
配置按钮权限
在菜单配置中添加按钮权限:
{
"name": "文章管理",
"buttons": [
{
"desc": "新增文章",
"permissionCode": "content:article:create",
"api": "content/create",
"httpMethod": "POST"
},
{
"desc": "编辑文章",
"permissionCode": "content:article:update",
"api": "content/update",
"httpMethod": "PUT"
},
{
"desc": "删除文章",
"permissionCode": "content:article:delete",
"api": "content/removes",
"httpMethod": "DELETE"
}
]
}
按钮配置说明
描述 (desc):
- 按钮的功能描述
- 显示在权限配置界面
权限代码 (permissionCode):
- 唯一的权限标识
- 格式:
模块:功能:操作 - 示例:
content:article:create
API 路径 (api):
- 关联的后端 API
- 格式:
controller/method - 示例:
content/create
HTTP 方法 (httpMethod):
- API 的 HTTP 请求方法
- 支持:GET、POST、PUT、PATCH、DELETE
- 默认:POST
按钮权限验证
系统会自动验证按钮配置的安全性:
API 格式验证:
- 必须符合
controller/method格式 - 只能包含字母和数字
- 不能包含特殊字符
权限代码验证:
- 必须填写权限代码(严格模式)
- 权限代码必须唯一
- 建议使用统一的命名规范
HTTP 方法验证:
- 必须是支持的 HTTP 方法
- 不区分大小写
- 无效方法会被拒绝
权限代码规范
命名规范
建议使用以下格式:
模块:功能:操作
示例:
content:article:view # 查看文章
content:article:create # 创建文章
content:article:update # 更新文章
content:article:delete # 删除文章
content:article:publish # 发布文章
user:manage:view # 查看用户
user:manage:create # 创建用户
user:manage:update # 更新用户
user:manage:delete # 删除用户
system:config:view # 查看配置
system:config:update # 更新配置
权限层级
模块级权限:
- 控制整个模块的访问
- 示例:
content:*
功能级权限:
- 控制具体功能的访问
- 示例:
content:article:*
操作级权限:
- 控制具体操作的执行
- 示例:
content:article:delete
角色与权限
角色管理
在"系统设置" → "角色管理"中管理角色:
创建角色:
- 点击"新增角色"
- 填写角色名称和描述
- 选择菜单权限
- 选择按钮权限
- 保存角色
角色示例:
{
"name": "内容编辑",
"description": "负责内容的创建和编辑",
"menus": [
"menu_content_id",
"menu_article_id"
],
"permissions": [
"content:article:view",
"content:article:create",
"content:article:update"
]
}
分配角色
在"用户管理"中为用户分配角色:
- 编辑用户信息
- 选择用户角色
- 保存更改
注意:
- 一个用户可以拥有多个角色
- 权限会自动合并
- 超级管理员拥有所有权限
权限验证
前端权限验证
在前端使用权限指令:
<!-- 按钮权限控制 -->
<el-button
v-permission="'content:article:create'"
@click="handleCreate">
新增文章
</el-button>
<!-- 菜单权限控制 -->
<el-menu-item
v-if="hasPermission('content:article:view')"
index="/content/article">
文章管理
</el-menu-item>
后端权限验证
后端 API 会自动验证权限:
// 控制器中的权限验证
async create(ctx) {
// 系统会自动验证用户是否有 content:article:create 权限
// 如果没有权限,会返回 403 错误
const article = await ctx.service.content.create(data);
ctx.helper.renderSuccess(ctx, { data: article });
}
权限检查流程
- 用户登录:获取用户角色和权限
- 菜单加载:根据权限过滤菜单
- 页面访问:检查页面访问权限
- 操作执行:验证按钮操作权限
- API 调用:后端验证 API 权限
最佳实践
权限设计原则
- 最小权限原则
- 只授予必要的权限
- 避免权限过度分配
- 定期审查权限
- 职责分离
- 不同角色负责不同功能
- 避免权限冲突
- 明确责任边界
- 权限继承
- 合理使用角色继承
- 避免权限重复配置
- 简化权限管理
菜单组织建议
- 逻辑分组
- 按业务模块组织菜单
- 保持菜单层级清晰
- 避免菜单过深
- 命名规范
- 使用清晰的菜单名称
- 保持命名一致性
- 避免歧义
- 图标使用
- 为菜单添加合适的图标
- 提高界面识别度
- 保持图标风格统一
安全建议
- 严格模式
- 启用权限代码强制绑定
- 验证 API 路径格式
- 检查 HTTP 方法有效性
- 定期审计
- 检查权限配置
- 清理无用权限
- 更新权限文档
- 测试验证
- 测试不同角色的权限
- 验证权限隔离
- 检查越权访问
常见问题
菜单不显示
问题:用户登录后看不到某些菜单
解决方案:
- 检查菜单是否启用
- 确认用户角色是否包含该菜单权限
- 检查菜单的父级菜单是否有权限
- 清除缓存重新登录
按钮权限无效
问题:配置了按钮权限但仍然可以操作
解决方案:
- 检查权限代码是否正确
- 确认角色是否包含该权限
- 检查前端权限指令是否正确使用
- 验证后端 API 权限验证
API 路径验证失败
问题:保存菜单时提示 API 路径格式错误
解决方案:
- 确保 API 路径符合
controller/method格式 - 只使用字母和数字
- 不要包含特殊字符
- 检查路径长度(不超过 100 字符)
权限代码冲突
问题:提示权限代码已存在
解决方案:
- 检查是否有重复的权限代码
- 使用唯一的权限标识
- 遵循命名规范
- 查看现有权限列表
以上内容是否对您有帮助:
← 站点地图管理

免费 AI IDE


更多建议: