Add comprehensive documentation for system architecture and best practices
This commit is contained in:
221
.cursor/rules/permission-system.mdc
Normal file
221
.cursor/rules/permission-system.mdc
Normal file
@@ -0,0 +1,221 @@
|
||||
# 权限系统详解
|
||||
|
||||
## 权限架构概述
|
||||
|
||||
### RBAC 权限模型
|
||||
基于角色的访问控制(Role-Based Access Control),包含:
|
||||
- **用户 (User)**: 系统操作者
|
||||
- **角色 (Role)**: 权限的集合
|
||||
- **菜单 (Menu)**: 系统功能模块
|
||||
- **权限 (Permission)**: 具体操作权限
|
||||
|
||||
### 核心权限表
|
||||
- `system_users`: 用户表
|
||||
- `system_role`: 角色表
|
||||
- `system_menu`: 菜单权限表
|
||||
- `system_user_role`: 用户角色关联表
|
||||
- `system_role_menu`: 角色菜单关联表
|
||||
|
||||
## 权限控制实现
|
||||
|
||||
### 菜单权限控制
|
||||
```java
|
||||
// 控制器方法级别权限
|
||||
@PreAuthorize("@ss.hasPermission('system:user:query')")
|
||||
public CommonResult<PageResult<UserRespVO>> getUserPage() {
|
||||
// 业务逻辑
|
||||
}
|
||||
|
||||
// 权限标识规范:模块:功能:操作
|
||||
// system:user:query - 系统管理:用户管理:查询
|
||||
// system:user:create - 系统管理:用户管理:新增
|
||||
// system:user:update - 系统管理:用户管理:修改
|
||||
// system:user:delete - 系统管理:用户管理:删除
|
||||
```
|
||||
|
||||
### 数据权限控制
|
||||
```java
|
||||
// 部门数据权限
|
||||
@DataPermission(deptAlias = "d", userAlias = "u")
|
||||
public PageResult<UserDO> getUserPage(UserPageReqVO reqVO) {
|
||||
// 自动添加数据权限 WHERE 条件
|
||||
}
|
||||
|
||||
// 数据权限范围:
|
||||
// 1. 全部数据权限
|
||||
// 2. 指定部门数据权限
|
||||
// 3. 本部门数据权限
|
||||
// 4. 本部门及以下数据权限
|
||||
// 5. 仅本人数据权限
|
||||
```
|
||||
|
||||
### 字段权限控制
|
||||
```java
|
||||
// 在 VO 类中使用注解控制字段显示
|
||||
@JsonIgnore
|
||||
@ApiModelProperty(hidden = true)
|
||||
private String sensitiveField;
|
||||
```
|
||||
|
||||
## 权限配置管理
|
||||
|
||||
### 菜单配置
|
||||
在系统管理 -> 菜单管理中配置:
|
||||
- **菜单类型**: 目录、菜单、按钮
|
||||
- **权限标识**: 用于 @PreAuthorize 检查
|
||||
- **路由地址**: 前端路由路径
|
||||
- **组件路径**: Vue 组件路径
|
||||
- **是否缓存**: 页面缓存控制
|
||||
|
||||
### 角色配置
|
||||
在系统管理 -> 角色管理中配置:
|
||||
- **角色权限**: 分配菜单权限
|
||||
- **数据权限**: 设置数据访问范围
|
||||
- **状态控制**: 启用/禁用角色
|
||||
|
||||
### 用户配置
|
||||
在系统管理 -> 用户管理中配置:
|
||||
- **角色分配**: 为用户分配角色
|
||||
- **部门归属**: 确定数据权限范围
|
||||
- **状态控制**: 启用/禁用用户
|
||||
|
||||
## 前端权限集成
|
||||
|
||||
### 路由权限
|
||||
```javascript
|
||||
// 在路由配置中检查权限
|
||||
{
|
||||
path: '/user',
|
||||
component: Layout,
|
||||
meta: {
|
||||
permissions: ['system:user:query']
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 按钮权限
|
||||
```vue
|
||||
<!-- 使用 v-hasPermi 指令控制按钮显示 -->
|
||||
<el-button
|
||||
v-hasPermi="['system:user:create']"
|
||||
@click="handleAdd">
|
||||
新增
|
||||
</el-button>
|
||||
```
|
||||
|
||||
### 动态菜单
|
||||
前端根据用户权限动态生成菜单结构。
|
||||
|
||||
## 权限缓存策略
|
||||
|
||||
### Redis 缓存
|
||||
- **用户权限**: `user:permission:{userId}`
|
||||
- **角色权限**: `role:permission:{roleId}`
|
||||
- **菜单树**: `menu:tree`
|
||||
|
||||
### 缓存更新
|
||||
权限变更时自动清理相关缓存:
|
||||
```java
|
||||
@CacheEvict(value = "user:permission", key = "#userId")
|
||||
public void updateUserRole(Long userId, Set<Long> roleIds) {
|
||||
// 更新用户角色
|
||||
}
|
||||
```
|
||||
|
||||
## 权限验证流程
|
||||
|
||||
### 登录验证
|
||||
1. 用户登录验证
|
||||
2. 获取用户角色和权限
|
||||
3. 生成 JWT Token
|
||||
4. 缓存用户权限信息
|
||||
|
||||
### 请求验证
|
||||
1. 解析 JWT Token
|
||||
2. 获取当前用户权限
|
||||
3. 检查接口权限要求
|
||||
4. 验证数据权限范围
|
||||
|
||||
## 特殊权限场景
|
||||
|
||||
### 超级管理员
|
||||
```java
|
||||
// 超级管理员拥有所有权限
|
||||
public static final Long SUPER_ADMIN_ID = 1L;
|
||||
|
||||
if (Objects.equals(userId, SUPER_ADMIN_ID)) {
|
||||
return true; // 跳过权限检查
|
||||
}
|
||||
```
|
||||
|
||||
### 租户隔离
|
||||
```java
|
||||
// 多租户权限隔离
|
||||
@TenantIgnore // 忽略租户隔离的接口
|
||||
public class SystemController {
|
||||
// 系统级别操作
|
||||
}
|
||||
```
|
||||
|
||||
### 临时权限
|
||||
```java
|
||||
// 临时提升权限执行操作
|
||||
@WithMockUser(authorities = "system:admin")
|
||||
public void executeAdminOperation() {
|
||||
// 执行需要管理员权限的操作
|
||||
}
|
||||
```
|
||||
|
||||
## 权限扩展
|
||||
|
||||
### 自定义权限验证器
|
||||
```java
|
||||
@Component("ss")
|
||||
public class SecurityFrameworkService {
|
||||
|
||||
public boolean hasPermission(String permission) {
|
||||
return hasAnyPermissions(permission);
|
||||
}
|
||||
|
||||
public boolean hasRole(String role) {
|
||||
return hasAnyRoles(role);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 权限注解扩展
|
||||
```java
|
||||
@Target({ElementType.METHOD, ElementType.TYPE})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@PreAuthorize("@ss.hasPermission(#permission)")
|
||||
public @interface RequiresPermissions {
|
||||
String value();
|
||||
}
|
||||
```
|
||||
|
||||
## 权限审计
|
||||
|
||||
### 操作日志
|
||||
自动记录权限相关的操作:
|
||||
- 用户登录/登出
|
||||
- 权限变更操作
|
||||
- 敏感数据访问
|
||||
|
||||
### 权限报表
|
||||
- 用户权限分析
|
||||
- 角色使用统计
|
||||
- 权限覆盖度分析
|
||||
|
||||
## 最佳实践
|
||||
|
||||
### 权限设计原则
|
||||
1. **最小权限原则**: 用户只获得必需的最小权限
|
||||
2. **职责分离**: 不同角色负责不同职责
|
||||
3. **权限继承**: 合理的权限层级结构
|
||||
4. **审计跟踪**: 完整的权限操作日志
|
||||
|
||||
### 性能优化
|
||||
1. **权限缓存**: 合理使用 Redis 缓存
|
||||
2. **批量查询**: 避免 N+1 查询问题
|
||||
3. **索引优化**: 权限查询相关表添加索引
|
||||
4. **异步处理**: 权限变更异步通知
|
Reference in New Issue
Block a user