256 lines
6.5 KiB
Markdown
256 lines
6.5 KiB
Markdown
# 权限管理模块使用说明
|
||
|
||
## 📋 功能概述
|
||
|
||
权限管理模块实现了基于角色的访问控制(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权限。
|
||
|
||
## 📞 技术支持
|
||
|
||
如有问题,请联系系统管理员或技术支持团队。
|
||
|