Files
ruoyi-vue-pro/.cursor/rules/permission-system.mdc

221 lines
5.0 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

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 权限模型
基于角色的访问控制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. **异步处理**: 权限变更异步通知