Appearance
权限控制
模块概述
权限控制是企业文档管理系统的安全核心,基于Apache Shiro实现完整的RBAC(Role-Based Access Control)权限模型。支持菜单权限、按钮权限、数据权限等多维度权限控制,确保文档资源的安全访问。
一、RBAC权限模型
1.1 模型结构
用户 (SysUser)
│
├──→ 角色 (SysRole) ──→ 菜单权限 (SysMenu)
│ ├── 页面访问权限
│ └── 按钮操作权限
│
└──→ 部门 (SysDept) ──→ 数据权限
├── 全部数据
├── 本部门数据
├── 本部门及以下数据
├── 仅本人数据
└── 自定义数据1.2 核心概念
| 概念 | 说明 |
|---|---|
| 用户 | 系统的使用者 |
| 角色 | 权限的集合,如管理员、普通用户 |
| 菜单 | 系统功能模块,对应页面和按钮 |
| 部门 | 组织架构单元,用于数据权限控制 |
二、菜单权限
2.1 权限类型
| 类型 | 说明 | 示例 |
|---|---|---|
| 目录权限 | 控制左侧菜单目录的显示 | 文档管理、系统管理 |
| 菜单权限 | 控制功能页面的访问 | 文件列表、用户管理 |
| 按钮权限 | 控制页面操作按钮 | 新增、编辑、删除按钮 |
2.2 权限标识
菜单权限使用权限字符串标识:
system:user:list - 用户列表查看权限
system:user:add - 用户新增权限
system:user:edit - 用户编辑权限
system:user:remove - 用户删除权限
system:user:export - 用户导出权限2.3 权限配置
- 为角色分配菜单权限
- 支持多选批量分配
- 权限即时生效
- 支持权限继承
三、数据权限
3.1 权限范围
| 范围 | 说明 | 适用场景 |
|---|---|---|
| 全部数据 | 可见所有文档 | 超级管理员 |
| 本部门数据 | 仅可见本部门文档 | 部门经理 |
| 本部门及以下 | 可见本部门及子部门文档 | 分管领导 |
| 仅本人数据 | 仅可见自己上传的文档 | 普通员工 |
| 自定义数据 | 按配置可见指定部门文档 | 特殊岗位 |
3.2 数据权限实现
通过MyBatis拦截器实现数据权限过滤:
java
// 数据权限注解
@DataScope(deptAlias = "d", userAlias = "u")
public List<SysFiles> selectList(SysFiles file) {
return fileMapper.selectList(file);
}3.3 权限规则
- 数据权限与角色绑定
- 支持多角色数据权限合并
- 取最大权限范围
四、角色管理
4.1 预置角色
| 角色 | 权限范围 |
|---|---|
| 超级管理员 | 拥有所有权限 |
| 部门管理员 | 管理部门内用户和文档 |
| 普通用户 | 管理个人文档 |
| 访客 | 仅查看公开文档 |
4.2 角色配置
- 角色增删改查
- 角色权限分配
- 角色数据范围设置
- 角色用户分配
4.3 角色继承
- 支持角色继承关系
- 子角色继承父角色权限
- 可覆盖父角色权限
五、用户管理
5.1 用户属性
| 属性 | 说明 |
|---|---|
| 基本信息 | 用户名、昵称、邮箱、电话 |
| 账号状态 | 启用/禁用 |
| 所属部门 | 决定数据权限范围 |
| 担任岗位 | 岗位角色 |
| 拥有角色 | 功能权限 |
5.2 用户操作
- 用户增删改查
- 密码重置
- 状态管理
- 批量导入导出
5.3 用户组
- 按部门分组
- 按岗位分组
- 自定义用户组
六、部门管理
6.1 部门结构
树形部门结构:
公司总部
├── 技术部
│ ├── 开发组
│ ├── 测试组
│ └── 运维组
├── 市场部
│ ├── 销售组
│ └── 推广组
├── 财务部
└── 人事部6.2 部门功能
- 部门增删改查
- 部门排序
- 部门人员管理
- 部门权限配置
七、权限验证
7.1 前端验证
Thymeleaf模板中权限控制:
html
<!-- 有权限才显示按钮 -->
<a shiro:hasPermission="system:user:add" class="btn btn-primary">新增用户</a>
<!-- 有任一权限即显示 -->
<div shiro:hasAnyPermissions="system:user:add,system:user:edit">
操作按钮组
</div>7.2 后端验证
Controller层权限注解:
java
// 需要特定权限
@RequiresPermissions("system:user:add")
public AjaxResult add(@RequestBody SysUser user) {
// 新增用户逻辑
}
// 需要任一权限
@RequiresPermissions(value = {"system:user:add", "system:user:edit"}, logical = Logical.OR)
public AjaxResult save(@RequestBody SysUser user) {
// 保存用户逻辑
}7.3 数据权限验证
Service层数据权限注解:
java
@DataScope(deptAlias = "d")
public List<SysFiles> selectFileList(SysFiles file) {
// 自动拼接数据权限SQL
return fileMapper.selectList(file);
}八、安全机制
8.1 登录安全
- 密码加密存储(MD5 + Salt)
- 登录失败次数限制
- 登录IP限制
- 会话超时控制
8.2 操作安全
- 敏感操作二次确认
- 重要操作日志记录
- 异常操作预警
8.3 传输安全
- HTTPS传输加密
- 敏感数据脱敏显示
- Token身份验证
业务价值
安全可控
- 细粒度权限控制,防止越权访问
- 数据权限隔离,保护敏感信息
- 操作审计追溯,责任明确
管理便捷
- 角色权限模板,快速配置
- 权限继承机制,减少重复配置
- 批量权限分配,提升效率
合规审计
- 完整权限变更记录
- 用户操作日志
- 满足合规要求
技术实现
核心技术
- 安全框架:Apache Shiro 1.4.0
- 权限注解:自定义@DataScope注解
- 拦截器:MyBatis拦截器实现数据权限
- 缓存:EhCache缓存权限数据
权限流程
用户请求 → Shiro认证 → 权限校验 → 数据权限过滤 → 返回数据
↓ ↓ ↓
身份验证 菜单/按钮权限 SQL拼接返回项目概览