# 权限系统详解 ## 权限架构概述 ### 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> getUserPage() { // 业务逻辑 } // 权限标识规范:模块:功能:操作 // system:user:query - 系统管理:用户管理:查询 // system:user:create - 系统管理:用户管理:新增 // system:user:update - 系统管理:用户管理:修改 // system:user:delete - 系统管理:用户管理:删除 ``` ### 数据权限控制 ```java // 部门数据权限 @DataPermission(deptAlias = "d", userAlias = "u") public PageResult 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 新增 ``` ### 动态菜单 前端根据用户权限动态生成菜单结构。 ## 权限缓存策略 ### Redis 缓存 - **用户权限**: `user:permission:{userId}` - **角色权限**: `role:permission:{roleId}` - **菜单树**: `menu:tree` ### 缓存更新 权限变更时自动清理相关缓存: ```java @CacheEvict(value = "user:permission", key = "#userId") public void updateUserRole(Long userId, Set 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. **异步处理**: 权限变更异步通知