yunzer_go/权限管理模块使用说明.md
2025-11-03 18:00:12 +08:00

256 lines
6.5 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 权限管理模块使用说明
## 📋 功能概述
权限管理模块实现了基于角色的访问控制RBAC允许管理员为不同角色分配菜单和API访问权限。
## 🗄️ 数据库结构
### 1. 角色菜单关联表 `yz_role_menus`
```sql
CREATE TABLE yz_role_menus (
id INT AUTO_INCREMENT PRIMARY KEY,
role_id INT NOT NULL, -- 角色ID
menu_id INT NOT NULL, -- 菜单ID包括页面菜单和API接口
create_time DATETIME,
create_by VARCHAR(50),
UNIQUE KEY uk_role_menu (role_id, menu_id)
);
```
### 2. 菜单类型说明
- `menu_type = 1`: 页面菜单(显示在导航栏)
- `menu_type = 2`: API接口用于权限控制
## 🎯 核心功能
### 1. 权限分配
- 为角色分配菜单访问权限
- 为角色分配API访问权限
- 支持树形结构的权限选择
- 支持批量分配和取消
### 2. 权限验证
- 用户登录后自动加载权限
- 菜单根据权限动态显示
- API访问根据权限自动拦截
### 3. 权限查询
- 查询角色的所有权限
- 查询用户的所有权限
- 检查用户是否拥有特定权限
## 📡 API接口
### 1. 获取所有菜单权限列表
```
GET /api/permissions/menus
```
**响应示例:**
```json
{
"success": true,
"data": [
{
"menu_id": 1,
"menu_name": "系统管理",
"path": "/system",
"menu_type": 1,
"permission": null,
"parent_id": 0
}
]
}
```
### 2. 获取角色权限
```
GET /api/permissions/role/:roleId
```
**响应示例:**
```json
{
"success": true,
"data": {
"role_id": 1,
"role_name": "系统管理员",
"menu_ids": [1, 2, 3, 4, 5],
"permissions": ["user:list", "user:add", "file:upload"]
}
}
```
### 3. 分配角色权限
```
POST /api/permissions/role/:roleId
Content-Type: application/json
{
"menu_ids": [1, 2, 3, 4, 5]
}
```
### 4. 获取当前用户权限
```
GET /api/permissions/user
```
### 5. 获取用户菜单树
```
GET /api/permissions/user/menus
```
### 6. 检查权限
```
GET /api/permissions/check?permission=user:list
```
## 🎨 前端使用
### 页面访问
```
系统管理 -> 权限管理
```
### 权限分配流程
1. 在左侧选择要配置的角色
2. 在右侧权限树中勾选该角色应该拥有的菜单和API权限
3. 点击"保存权限设置"按钮
4. 系统会自动保存并刷新权限
### 权限树操作
- **全部展开**: 展开所有节点
- **全部折叠**: 折叠所有节点
- **全选**: 选中所有权限
- **取消全选**: 取消所有权限选择
- **搜索**: 支持按菜单名称、路径、权限标识搜索
### 权限类型标识
- 🔹 **页面**:蓝色标签,表示页面菜单
- 🟢 **API**绿色标签表示API接口
- **权限标识**:灰色标签,显示具体的权限代码
## 🔒 权限验证中间件(可选)
已创建权限验证中间件 `server/middleware/permission.go`,但默认未启用。
### 启用方法
`server/routers/router.go` 中添加:
```go
// 在JWT中间件之后添加权限验证中间件
beego.InsertFilter("/api/*", beego.BeforeExec, middleware.PermissionMiddleware())
```
### 注意事项
- 权限中间件会根据路径和方法自动匹配权限标识
- 如果用户没有对应权限,会返回 403 错误
- 公开接口(如登录、注册)会自动跳过权限验证
## 📊 权限标识规范
### 命名规范
格式:`模块:操作`
### 示例
- `user:list` - 查看用户列表
- `user:add` - 添加用户
- `user:edit` - 编辑用户
- `user:delete` - 删除用户
- `file:upload` - 上传文件
- `file:download` - 下载文件
- `role:create` - 创建角色
- `menu:update` - 更新菜单
## 🎯 使用场景
### 1. 为新角色分配权限
```
场景:公司新增了"财务专员"角色,需要分配相关权限
步骤:
1. 在角色管理中创建"财务专员"角色
2. 在权限管理中选择"财务专员"
3. 勾选需要的权限(如:文件管理、知识库查看)
4. 保存权限设置
```
### 2. 调整现有角色权限
```
场景:需要限制"普通用户"的某些功能
步骤:
1. 在权限管理中选择"普通用户"角色
2. 取消不需要的权限(如:用户管理、系统设置)
3. 保存权限设置
```
### 3. 权限审计
```
场景:查看某个角色有哪些权限
步骤:
1. 在权限管理中选择目标角色
2. 查看已勾选的权限项
3. 所有勾选项即为该角色拥有的权限
```
## 🔧 技术实现
### 后端
- **模型层**: `server/models/permission.go`
- 角色权限关联
- 权限查询和验证
- 菜单树构建
- **控制器层**: `server/controllers/permission.go`
- 权限分配接口
- 权限查询接口
- **中间件层**: `server/middleware/permission.go`
- API权限验证
- 路径-权限映射
### 前端
- **API层**: `pc/src/api/permission.js`
- 权限相关接口封装
- **页面层**: `pc/src/views/system/permissions/index.vue`
- 角色列表展示
- 权限树展示和操作
- 权限保存
## 📝 注意事项
1. **权限继承**:子菜单会继承父菜单的权限,建议同时勾选父子节点
2. **API权限**分配页面权限时也要分配对应的API权限
3. **系统管理员**role_id=1 的系统管理员已默认分配所有权限
4. **权限缓存**:修改权限后,用户需要重新登录才能生效(可以实现实时刷新)
5. **权限粒度**当前实现到API级别可以根据需要扩展到字段级别
## 🚀 后续优化建议
1. **权限缓存**: 使用Redis缓存用户权限提高查询效率
2. **实时刷新**: WebSocket推送权限变更无需重新登录
3. **权限日志**: 记录权限变更历史,便于审计
4. **数据权限**: 扩展到数据行级权限控制
5. **权限模板**: 预定义常用权限组合,快速分配
## ❓ 常见问题
### Q1: 修改权限后不生效?
A: 用户需要重新登录因为权限信息存储在JWT中。可以实现权限实时刷新机制。
### Q2: 如何给新用户分配权限?
A: 在用户管理中为用户分配角色,然后在权限管理中为该角色分配权限。
### Q3: 权限标识是什么?
A: 权限标识是API接口的唯一识别码格式为"模块:操作",用于权限验证。
### Q4: 为什么看不到某些菜单?
A: 检查该角色是否被分配了对应的菜单权限,同时确保菜单状态为启用。
### Q5: API接口返回403错误
A: 用户没有访问该接口的权限需要在权限管理中为用户角色分配对应的API权限。
## 📞 技术支持
如有问题,请联系系统管理员或技术支持团队。