926 lines
37 KiB
Markdown
926 lines
37 KiB
Markdown
# 认证授权域功能详细设计文档(反推自代码)
|
||
|
||
**文档类型**: 反推设计文档
|
||
**数据来源**: module-auth 实际代码
|
||
**生成日期**: 2026-04-23
|
||
**对照文档**: 05-AUTH.md(原需求设计)
|
||
|
||
---
|
||
|
||
## 一、领域概述
|
||
|
||
### 1.1 领域职责
|
||
|
||
认证授权域(module-auth)负责 Ether 平台的身份认证与授权管理,核心职责包括:
|
||
|
||
- **身份认证**:用户登录/登出、JWT Token 生成与验证、登录失败锁定
|
||
- **用户管理**:多类型用户(企业员工、项目员工、住户)的 CRUD 与扩展信息管理
|
||
- **RBAC 权限模型**:角色-权限-用户三层关联,支持项目级角色隔离
|
||
- **数据权限**:四级数据范围(ALL/PROJECT/DEPARTMENT/SELF)
|
||
- **项目隔离**:用户-项目多对多关联,项目成员管理与角色分配
|
||
- **部门管理**:树形组织架构,支持多种部门类型
|
||
- **审计日志**:操作日志自动记录,异步持久化,30天查询窗口
|
||
- **系统配置**:键值对形式的系统参数管理
|
||
|
||
### 1.2 核心概念
|
||
|
||
| 概念 | 说明 | 对应实体 |
|
||
|------|------|----------|
|
||
| **用户** | 系统登录账户,支持四种用户类型 | User |
|
||
| **企业员工** | 企业类型用户的扩展信息 | EnterpriseUser |
|
||
| **项目员工** | 项目类型员工的扩展信息,含班次、岗位状态 | ProjectStaff |
|
||
| **住户** | 业主/家属/租户,含认证流程 | Resident |
|
||
| **角色** | 权限集合,支持系统级/项目级/部门级 | Role |
|
||
| **权限** | 功能访问控制点,支持菜单/按钮/API三种类型 | Permission |
|
||
| **部门** | 组织架构节点,支持树形结构 | Dept |
|
||
| **用户-项目关联** | 用户参与项目的多对多关系 | UserProject |
|
||
| **项目员工角色** | 项目员工在项目中的角色分配 | ProjectStaffRole |
|
||
| **数据访问授权** | 细粒度数据访问控制记录 | DataAccess |
|
||
| **审计日志** | 操作审计记录 | AuditLog |
|
||
| **房屋空间** | 项目下的房屋/空间信息 | Space |
|
||
| **住户-房屋关联** | 住户与房屋的绑定关系 | ResidentSpace |
|
||
| **系统配置** | 键值对形式的系统参数 | SysConfig |
|
||
|
||
### 1.3 用户类型体系
|
||
|
||
```
|
||
User (基础用户)
|
||
├── EnterpriseUser (企业员工) — 共享主键一对一
|
||
│ └── 员工工号、部门、职位、入职日期、员工类别
|
||
├── ProjectStaff (项目员工) — 独立主键一对一
|
||
│ └── 所属项目、员工类型、班次、班组长、在岗状态
|
||
│ └── ProjectStaffRole (项目员工角色) — 一对多
|
||
└── Resident (住户) — 共享主键一对一
|
||
└── 身份证、住户类型、认证状态
|
||
└── ResidentSpace (住户-房屋关联) — 一对多
|
||
```
|
||
|
||
---
|
||
|
||
## 二、数据结构设计
|
||
|
||
### 2.1 User(用户)
|
||
|
||
| 字段 | 类型 | 约束 | 说明 |
|
||
|------|------|------|------|
|
||
| id | UUID | PK, 自动生成 | 用户唯一标识符 |
|
||
| username | VARCHAR(50) | NOT NULL, UNIQUE | 登录用户名,仅字母数字下划线,3-50位 |
|
||
| password | VARCHAR(255) | NOT NULL, JSON忽略 | BCrypt加密密码 |
|
||
| salt | VARCHAR | JSON忽略 | 密码盐值(BCrypt模式下冗余) |
|
||
| realName | VARCHAR(50) | | 真实姓名 |
|
||
| phone | VARCHAR(20) | 正则`^1[3-9]\d{9}$` | 手机号码 |
|
||
| email | VARCHAR(100) | @Email | 电子邮箱 |
|
||
| avatar | VARCHAR | | 头像URL |
|
||
| status | VARCHAR(20) | NOT NULL, 默认ACTIVE | 用户状态枚举 |
|
||
| userType | VARCHAR(20) | NOT NULL | 用户类型:ENTERPRISE/PROJECT_STAFF/RESIDENT/CUSTOMER |
|
||
| deptId | UUID | | 所属部门ID |
|
||
| lastLoginTime | LocalDateTime | | 最后登录时间 |
|
||
| lastLoginIp | VARCHAR | | 最后登录IP |
|
||
| roles | List\<Role\> | M2M, LAZY | 关联角色列表(通过auth_user_role表) |
|
||
| createdAt | LocalDateTime | NOT NULL, 自动填充 | 创建时间 |
|
||
| updatedAt | LocalDateTime | NOT NULL, 自动填充 | 更新时间 |
|
||
| createdBy | UUID | | 创建人ID |
|
||
|
||
**枚举:UserStatus**
|
||
|
||
| 值 | 描述 |
|
||
|----|------|
|
||
| ACTIVE | 正常 |
|
||
| LOCKED | 锁定 |
|
||
| DISABLED | 禁用 |
|
||
|
||
**关联表:auth_user_role**
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| user_id | UUID | FK → auth_user |
|
||
| role_id | UUID | FK → auth_role |
|
||
|
||
---
|
||
|
||
### 2.2 Role(角色)
|
||
|
||
| 字段 | 类型 | 约束 | 说明 |
|
||
|------|------|------|------|
|
||
| id | UUID | PK, 自动生成 | 角色唯一标识符 |
|
||
| code | VARCHAR(50) | NOT NULL, UNIQUE | 角色代码,仅字母数字下划线,2-50位 |
|
||
| name | VARCHAR(50) | NOT NULL | 角色名称 |
|
||
| description | VARCHAR(200) | | 角色描述 |
|
||
| type | VARCHAR(20) | NOT NULL | 角色类型枚举 |
|
||
| dataScope | VARCHAR(20) | 默认SELF | 数据范围枚举 |
|
||
| projectId | UUID | | 所属项目ID(NULL=系统级) |
|
||
| status | VARCHAR(20) | NOT NULL, 默认ENABLED | 角色状态枚举 |
|
||
| permissions | List\<Permission\> | M2M, LAZY | 关联权限列表(通过auth_role_permission表) |
|
||
| createdAt | LocalDateTime | NOT NULL, 自动填充 | 创建时间 |
|
||
| updatedAt | LocalDateTime | NOT NULL, 自动填充 | 更新时间 |
|
||
|
||
**枚举:RoleType**
|
||
|
||
| 值 | 描述 |
|
||
|----|------|
|
||
| SYSTEM | 系统级 |
|
||
| PROJECT | 项目级 |
|
||
| DEPARTMENT | 部门级 |
|
||
|
||
**枚举:DataScope**
|
||
|
||
| 值 | 描述 |
|
||
|----|------|
|
||
| ALL | 全部数据 |
|
||
| PROJECT | 本项目数据 |
|
||
| DEPARTMENT | 本部门数据 |
|
||
| SELF | 仅本人数据 |
|
||
|
||
**枚举:RoleStatus**
|
||
|
||
| 值 | 描述 |
|
||
|----|------|
|
||
| ENABLED | 启用 |
|
||
| DISABLED | 禁用 |
|
||
|
||
**关联表:auth_role_permission**
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| role_id | UUID | FK → auth_role |
|
||
| permission_id | UUID | FK → auth_permission |
|
||
|
||
---
|
||
|
||
### 2.3 Permission(权限)
|
||
|
||
| 字段 | 类型 | 约束 | 说明 |
|
||
|------|------|------|------|
|
||
| id | UUID | PK, 自动生成 | 权限唯一标识符 |
|
||
| code | VARCHAR(100) | NOT NULL, UNIQUE | 权限代码,格式`module:resource:action`,仅字母数字冒号下划线 |
|
||
| name | VARCHAR(100) | NOT NULL | 权限名称 |
|
||
| type | VARCHAR(20) | | 权限类型:MENU/BUTTON/API |
|
||
| resource | VARCHAR(50) | | 资源路径(API类型) |
|
||
| method | VARCHAR(50) | | HTTP方法(API类型) |
|
||
| description | VARCHAR(200) | | 权限描述 |
|
||
| parentCode | VARCHAR(50) | | 父权限代码(树形结构) |
|
||
| sortOrder | Integer | | 排序序号 |
|
||
| roles | List\<Role\> | M2M, LAZY | 关联角色列表 |
|
||
| createdAt | LocalDateTime | 自动填充 | 创建时间 |
|
||
| updatedAt | LocalDateTime | 自动填充 | 更新时间 |
|
||
|
||
---
|
||
|
||
### 2.4 Dept(部门)
|
||
|
||
| 字段 | 类型 | 约束 | 说明 |
|
||
|------|------|------|------|
|
||
| id | UUID | PK, 自动生成 | 部门唯一标识符 |
|
||
| parentId | UUID | | 上级部门ID(NULL=顶级) |
|
||
| deptName | VARCHAR(100) | NOT NULL | 部门名称 |
|
||
| deptType | VARCHAR(20) | 默认ADMIN | 部门类型 |
|
||
| leaderId | UUID | | 部门负责人ID |
|
||
| sortOrder | Integer | | 排序序号 |
|
||
| status | VARCHAR(20) | 默认ACTIVE | 状态:ACTIVE/DISABLED |
|
||
| createdAt | LocalDateTime | 自动填充 | 创建时间 |
|
||
| updatedAt | LocalDateTime | 自动填充 | 更新时间 |
|
||
| createdBy | UUID | | 创建人ID |
|
||
| updatedBy | UUID | | 更新人ID |
|
||
|
||
**枚举:DeptType**
|
||
|
||
| 值 | 描述 |
|
||
|----|------|
|
||
| ADMIN | 行政管理 |
|
||
| ENGINEERING | 工程部 |
|
||
| SECURITY | 安保部 |
|
||
| CS | 客服部 |
|
||
| CLEANING | 保洁部 |
|
||
|
||
---
|
||
|
||
### 2.5 EnterpriseUser(企业员工)
|
||
|
||
| 字段 | 类型 | 约束 | 说明 |
|
||
|------|------|------|------|
|
||
| userId | UUID | PK, FK → auth_user | 用户ID(共享主键) |
|
||
| employeeNo | VARCHAR(50) | | 员工工号 |
|
||
| deptId | UUID | | 部门ID |
|
||
| position | VARCHAR(50) | | 职位 |
|
||
| entryDate | LocalDate | | 入职日期 |
|
||
| userCategory | VARCHAR(50) | | 员工类别:ENTERPRISE/MANAGEMENT |
|
||
| user | User | @OneToOne @MapsId | 关联User实体 |
|
||
|
||
---
|
||
|
||
### 2.6 ProjectStaff(项目员工)
|
||
|
||
| 字段 | 类型 | 约束 | 说明 |
|
||
|------|------|------|------|
|
||
| id | UUID | PK, 自动生成 | 主键ID |
|
||
| userId | UUID | FK → auth_user | 用户ID |
|
||
| projectId | UUID | | 所属项目ID |
|
||
| deptId | UUID | | 所属部门ID |
|
||
| staffType | VARCHAR(50) | | 员工类型 |
|
||
| shiftType | VARCHAR(20) | | 班次类型:DAY/NIGHT/ROTATION |
|
||
| leaderId | UUID | | 班组长ID |
|
||
| assignmentStatus | VARCHAR(20) | | 在岗状态:ASSIGNED/ON_LEAVE/TRANSFERRED |
|
||
| staffRoles | List\<ProjectStaffRole\> | @OneToMany, 级联删除 | 员工角色列表 |
|
||
| createdAt | LocalDateTime | | 创建时间 |
|
||
| updatedAt | LocalDateTime | | 更新时间 |
|
||
| user | User | @OneToOne | 关联User实体 |
|
||
|
||
**StaffType 枚举值**:SECURITY / CLEANING / GARDEN / MAINTENANCE / CUSTOMER_SERVICE / GENERAL
|
||
|
||
---
|
||
|
||
### 2.7 ProjectStaffRole(项目员工角色)
|
||
|
||
| 字段 | 类型 | 约束 | 说明 |
|
||
|------|------|------|------|
|
||
| id | UUID | PK, 自动生成 | 主键ID |
|
||
| staff | ProjectStaff | @ManyToOne, LAZY, NOT NULL | 关联项目员工 |
|
||
| role | Role | @ManyToOne, EAGER, NOT NULL | 关联角色 |
|
||
| createdAt | LocalDateTime | 自动填充 | 创建时间 |
|
||
|
||
---
|
||
|
||
### 2.8 Resident(住户)
|
||
|
||
| 字段 | 类型 | 约束 | 说明 |
|
||
|------|------|------|------|
|
||
| userId | UUID | PK, FK → auth_user | 用户ID(共享主键) |
|
||
| idCard | VARCHAR(18) | JSON忽略 | 身份证号码 |
|
||
| residentType | VARCHAR(20) | | 住户类型:OWNER/FAMILY/TENANT |
|
||
| verificationStatus | VARCHAR(20) | | 认证状态:UNVERIFIED/PENDING/VERIFIED/REJECTED |
|
||
| verifiedAt | LocalDateTime | | 认证时间 |
|
||
| verifiedBy | UUID | | 认证人ID |
|
||
| user | User | @OneToOne @MapsId | 关联User实体 |
|
||
| createdAt | LocalDateTime | NOT NULL | 创建时间 |
|
||
| updatedAt | LocalDateTime | NOT NULL | 更新时间 |
|
||
| createdBy | UUID | | 创建人ID |
|
||
| updatedBy | UUID | | 更新人ID |
|
||
|
||
---
|
||
|
||
### 2.9 ResidentSpace(住户-房屋关联)
|
||
|
||
| 字段 | 类型 | 约束 | 说明 |
|
||
|------|------|------|------|
|
||
| id | UUID | PK, 自动生成 | 关联记录ID |
|
||
| userId | UUID | NOT NULL | 用户ID |
|
||
| spaceId | UUID | NOT NULL | 房屋ID |
|
||
| relationType | VARCHAR(20) | | 关系类型:OWNER/FAMILY/TENANT |
|
||
| bindingStatus | VARCHAR(20) | | 绑定状态:PENDING/ACTIVE/EXPIRED/CANCELLED |
|
||
| startDate | LocalDate | | 生效日期 |
|
||
| endDate | LocalDate | | 失效日期(NULL=永久) |
|
||
|
||
---
|
||
|
||
### 2.10 Space(房屋空间)
|
||
|
||
| 字段 | 类型 | 约束 | 说明 |
|
||
|------|------|------|------|
|
||
| id | UUID | PK, 自动生成 | 空间ID |
|
||
| projectId | UUID | | 所属项目ID |
|
||
| building | VARCHAR(50) | | 楼栋 |
|
||
| unit | VARCHAR(50) | | 单元 |
|
||
| roomNo | VARCHAR(50) | | 房号 |
|
||
| spaceType | VARCHAR(20) | | 房屋类型:RESIDENTIAL/COMMERCIAL |
|
||
| floor | Integer | | 楼层 |
|
||
| unitArea | BigDecimal | | 建筑面积(㎡) |
|
||
| status | VARCHAR(20) | | 状态 |
|
||
|
||
---
|
||
|
||
### 2.11 UserProject(用户-项目关联)
|
||
|
||
| 字段 | 类型 | 约束 | 说明 |
|
||
|------|------|------|------|
|
||
| id | UUID | PK, 自动生成 | 关联记录ID |
|
||
| userId | UUID | NOT NULL | 用户ID |
|
||
| projectId | UUID | NOT NULL | 项目ID |
|
||
| roleInProject | VARCHAR | NOT NULL, 默认"member" | 项目中角色:leader/member/viewer |
|
||
| joinedAt | LocalDateTime | NOT NULL, 默认当前时间 | 加入时间 |
|
||
|
||
---
|
||
|
||
### 2.12 DataAccess(数据访问授权)
|
||
|
||
| 字段 | 类型 | 约束 | 说明 |
|
||
|------|------|------|------|
|
||
| id | UUID | PK, 自动生成 | 授权记录ID |
|
||
| dataType | VARCHAR | NOT NULL | 数据类型 |
|
||
| dataId | UUID | NOT NULL | 数据ID |
|
||
| accessType | VARCHAR | NOT NULL | 访问者类型 |
|
||
| accessId | UUID | NOT NULL | 访问者ID |
|
||
| accessLevel | VARCHAR | NOT NULL, 默认"read" | 访问级别 |
|
||
| grantedBy | UUID | | 授权人ID |
|
||
| grantedAt | LocalDateTime | NOT NULL, 默认当前时间 | 授权时间 |
|
||
|
||
---
|
||
|
||
### 2.13 AuditLog(审计日志)
|
||
|
||
| 字段 | 类型 | 约束 | 说明 |
|
||
|------|------|------|------|
|
||
| id | UUID | PK, 自动生成 | 日志ID |
|
||
| userId | UUID | | 操作用户ID |
|
||
| username | VARCHAR(64) | NOT NULL | 操作用户名 |
|
||
| operation | VARCHAR(128) | NOT NULL | 操作描述 |
|
||
| module | VARCHAR(64) | NOT NULL | 模块标识 |
|
||
| action | VARCHAR(64) | NOT NULL | 操作类型枚举 |
|
||
| targetType | VARCHAR(64) | | 目标类型 |
|
||
| targetId | VARCHAR(64) | | 目标ID |
|
||
| content | VARCHAR(2000) | | 操作内容 |
|
||
| params | LONGVARCHAR(5000) | | 请求参数 |
|
||
| result | LONGVARCHAR(5000) | | 操作结果 |
|
||
| ipAddress | VARCHAR(64) | | IP地址 |
|
||
| userAgent | VARCHAR(512) | | 用户代理 |
|
||
| requestUrl | VARCHAR(512) | | 请求URL |
|
||
| requestMethod | VARCHAR(16) | | 请求方法 |
|
||
| executionTimeMs | Integer | | 执行耗时(ms) |
|
||
| status | VARCHAR(16) | 默认SUCCESS | 状态枚举 |
|
||
| errorMsg | VARCHAR(2000) | | 错误信息 |
|
||
| createdAt | LocalDateTime | NOT NULL, 自动填充 | 创建时间 |
|
||
| tenantId | UUID | | 租户ID |
|
||
|
||
**索引**:
|
||
- `idx_audit_log_created_at` → createdAt
|
||
- `idx_audit_log_user_id` → userId
|
||
- `idx_audit_log_module` → module
|
||
- `idx_audit_log_action` → action
|
||
- `idx_al_user_createdat` → userId, createdAt DESC
|
||
|
||
**枚举:ActionType**
|
||
|
||
| 值 | 描述 |
|
||
|----|------|
|
||
| CREATE | 创建 |
|
||
| UPDATE | 修改 |
|
||
| DELETE | 删除 |
|
||
| QUERY | 查询 |
|
||
| VIEW | 查看 |
|
||
| LOGIN | 登录 |
|
||
| LOGOUT | 登出 |
|
||
| EXPORT | 导出 |
|
||
| IMPORT | 导入 |
|
||
| ASSIGN | 分配 |
|
||
| REVOKE | 撤销 |
|
||
|
||
**枚举:Status**
|
||
|
||
| 值 | 描述 |
|
||
|----|------|
|
||
| SUCCESS | 成功 |
|
||
| FAIL | 失败 |
|
||
|
||
---
|
||
|
||
### 2.14 SysConfig(系统配置)
|
||
|
||
| 字段 | 类型 | 约束 | 说明 |
|
||
|------|------|------|------|
|
||
| id | UUID | PK, 自动生成 | 配置项ID |
|
||
| configKey | VARCHAR(128) | NOT NULL, UNIQUE | 配置键 |
|
||
| configValue | VARCHAR(5000) | | 配置值 |
|
||
| description | VARCHAR(256) | | 配置描述 |
|
||
| createdAt | LocalDateTime | NOT NULL, 自动填充 | 创建时间 |
|
||
| updatedAt | LocalDateTime | NOT NULL, 自动填充 | 更新时间 |
|
||
|
||
---
|
||
|
||
### 2.15 实体关系图
|
||
|
||
```
|
||
┌──────────┐ M2M ┌──────────┐ M2M ┌────────────┐
|
||
│ User │◄────────────►│ Role │◄────────────►│ Permission │
|
||
└────┬─────┘ auth_user └────┬─────┘ auth_role └────────────┘
|
||
│ _role │ _permission
|
||
│ 1:1 │
|
||
▼ ▼
|
||
┌──────────────┐ ┌──────────────────┐
|
||
│EnterpriseUser│ │ ProjectStaff │
|
||
│ (共享主键) │ │ (独立主键) │
|
||
└──────────────┘ └───────┬──────────┘
|
||
│ 1:N
|
||
▼
|
||
┌──────────────────┐
|
||
│ProjectStaffRole │──────► Role
|
||
└──────────────────┘
|
||
|
||
┌──────────┐ 1:1 ┌──────────┐
|
||
│ User │◄───────────►│ Resident │
|
||
└──────────┘ └────┬─────┘
|
||
│ 1:N
|
||
▼
|
||
┌───────────────┐ N:1 ┌───────┐
|
||
│ResidentSpace │◄────────────►│ Space │
|
||
└───────────────┘ └───────┘
|
||
|
||
┌──────────┐ N:N ┌──────────┐
|
||
│ User │◄───────────►│ Project │ (通过 UserProject)
|
||
└──────────┘ └──────────┘
|
||
|
||
┌──────────┐
|
||
│ Dept │ 树形结构(parentId → 自引用)
|
||
└──────────┘
|
||
|
||
┌──────────┐
|
||
│DataAccess│ 通用数据访问授权
|
||
└──────────┘
|
||
|
||
┌──────────┐
|
||
│ AuditLog │ 操作审计日志
|
||
└──────────┘
|
||
|
||
┌──────────┐
|
||
│ SysConfig│ 系统键值对配置
|
||
└──────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 三、API接口设计
|
||
|
||
### 3.1 AuthController — 认证管理
|
||
|
||
**基础路径**: `/api/auth`
|
||
|
||
| 方法 | 路径 | 说明 | 请求体 | 响应 |
|
||
|------|------|------|--------|------|
|
||
| POST | `/login` | 用户登录 | `{username, password}` | `{token, userId, username, realName, roles}` |
|
||
| POST | `/logout` | 用户登出 | Header: Authorization | void |
|
||
| GET | `/me` | 获取当前用户 | Header: Authorization | `{username}` |
|
||
| POST | `/refresh` | 刷新Token | Header: Authorization | `{token}` |
|
||
|
||
**登录流程**:
|
||
1. 检查登录失败锁定(Redis,5次失败锁定10分钟)
|
||
2. 查询用户(含角色)
|
||
3. 验证密码(BCrypt)
|
||
4. 检查用户状态(LOCKED/DISABLED拒绝)
|
||
5. 收集所有角色(用户直接角色 + 项目员工角色)
|
||
6. 生成JWT Token(含userId、username、roles claims)
|
||
7. 返回Token和用户基本信息
|
||
|
||
---
|
||
|
||
### 3.2 UserController — 用户管理
|
||
|
||
**基础路径**: `/api/auth/users`
|
||
|
||
| 方法 | 路径 | 说明 | 审计日志 |
|
||
|------|------|------|----------|
|
||
| GET | `/` | 分页查询用户列表 | - |
|
||
| GET | `/{id}` | 根据ID获取用户 | - |
|
||
| POST | `/` | 创建用户 | CREATE |
|
||
| PUT | `/{id}` | 更新用户 | UPDATE |
|
||
| DELETE | `/{id}` | 删除用户 | DELETE |
|
||
| PUT | `/{id}/password` | 修改密码 | UPDATE |
|
||
| POST | `/{id}/roles` | 分配角色 | ASSIGN |
|
||
| GET | `/{id}/projects` | 获取用户项目列表 | - |
|
||
| POST | `/{id}/projects` | 添加用户到项目 | - |
|
||
| DELETE | `/{id}/projects/{projectId}` | 从项目移除用户 | - |
|
||
| GET | `/enterprise` | 获取企业员工列表 | - |
|
||
|
||
**密码修改规则**:
|
||
- 需验证原密码
|
||
- 新密码需通过强度校验(8-20位,大小写+数字+特殊字符)
|
||
- 弱密码检测(黑名单:password、123456、admin等)
|
||
|
||
---
|
||
|
||
### 3.3 RoleController — 角色管理
|
||
|
||
**基础路径**: `/api/auth/roles`
|
||
|
||
| 方法 | 路径 | 说明 | 审计日志 |
|
||
|------|------|------|----------|
|
||
| GET | `/` | 分页查询角色列表 | - |
|
||
| GET | `/{id}` | 根据ID获取角色 | - |
|
||
| GET | `/project/{projectId}` | 根据项目ID查询角色 | - |
|
||
| POST | `/` | 创建角色 | CREATE |
|
||
| PUT | `/{id}` | 更新角色 | UPDATE |
|
||
| DELETE | `/{id}` | 删除角色 | DELETE |
|
||
| POST | `/{id}/permissions` | 为角色分配权限 | ASSIGN |
|
||
| GET | `/{id}/permissions` | 获取角色权限列表 | - |
|
||
| GET | `/{id}/users` | 获取拥有某角色的用户 | - |
|
||
|
||
---
|
||
|
||
### 3.4 PermissionController — 权限管理
|
||
|
||
**基础路径**: `/api/auth/permissions`
|
||
|
||
| 方法 | 路径 | 说明 | 审计日志 |
|
||
|------|------|------|----------|
|
||
| GET | `/` | 分页查询权限列表 | - |
|
||
| GET | `/{id}` | 根据ID获取权限 | - |
|
||
| GET | `/type/{type}` | 根据类型查询权限 | - |
|
||
| GET | `/menus` | 查询所有菜单权限 | - |
|
||
| POST | `/` | 创建权限 | - |
|
||
| PUT | `/{id}` | 更新权限 | - |
|
||
| DELETE | `/{id}` | 删除权限 | - |
|
||
|
||
---
|
||
|
||
### 3.5 DeptController — 部门管理
|
||
|
||
**基础路径**: `/api/auth/depts`
|
||
|
||
| 方法 | 路径 | 说明 | 审计日志 |
|
||
|------|------|------|----------|
|
||
| GET | `/tree` | 获取部门树 | - |
|
||
| GET | `/` | 获取所有启用部门 | - |
|
||
| GET | `/{id}` | 根据ID获取部门 | - |
|
||
| POST | `/` | 创建部门 | CREATE |
|
||
| PUT | `/{id}` | 更新部门 | UPDATE |
|
||
| DELETE | `/{id}` | 删除部门 | DELETE |
|
||
| GET | `/{deptId}/members` | 获取部门成员 | - |
|
||
| GET | `/by-type/{deptType}` | 根据类型查询部门 | - |
|
||
|
||
**部门树构建**:后端返回扁平列表,Controller层递归构建树形结构(DeptVO含children字段)
|
||
|
||
---
|
||
|
||
### 3.6 ProjectMemberController — 项目成员管理
|
||
|
||
**基础路径**: `/api/auth/projects`
|
||
|
||
| 方法 | 路径 | 说明 | 审计日志 |
|
||
|------|------|------|----------|
|
||
| GET | `/{projectId}/members` | 查询项目成员列表(分页) | - |
|
||
| GET | `/{projectId}/available-members` | 获取可添加成员(企业员工) | - |
|
||
| POST | `/{projectId}/members` | 添加项目成员 | CREATE |
|
||
| DELETE | `/{projectId}/members/{userId}` | 移除项目成员 | DELETE |
|
||
|
||
**添加项目成员流程**:
|
||
1. 创建/更新 ProjectStaff 记录(设定员工类型、分配状态)
|
||
2. 覆盖模式更新角色:先删除旧角色,再添加新角色
|
||
3. 支持 search 参数模糊搜索可用成员(用户名/姓名)
|
||
|
||
---
|
||
|
||
### 3.7 DataAccessController — 数据访问授权
|
||
|
||
**基础路径**: `/api/data-access`
|
||
|
||
| 方法 | 路径 | 说明 | 请求体 |
|
||
|------|------|------|--------|
|
||
| POST | `/` | 授予数据访问权限 | `{dataType, dataId, accessType, accessId, accessLevel}` |
|
||
| DELETE | `/{id}` | 撤销数据访问权限 | - |
|
||
| GET | `/` | 查询数据访问记录 | 参数: dataType, dataId |
|
||
|
||
**授权逻辑**:若已存在相同 dataType+dataId+accessType+accessId 的记录,则更新 accessLevel;否则新建。
|
||
|
||
---
|
||
|
||
### 3.8 AuditLogController — 审计日志
|
||
|
||
**基础路径**: `/api/audit-logs`
|
||
|
||
| 方法 | 路径 | 说明 |
|
||
|------|------|------|
|
||
| GET | `/` | 分页查询审计日志(支持module/action/username/日期范围筛选) |
|
||
| GET | `/modules` | 获取模块列表(用于筛选下拉) |
|
||
| GET | `/actions` | 获取操作类型列表(用于筛选下拉) |
|
||
| GET | `/stats` | 获取最近30天日志统计 |
|
||
|
||
**查询约束**:强制限制查询范围不超过30天,防止大量数据查询。
|
||
|
||
**模块列表**:USER / ROLE / PERMISSION / PROJECT / AUTH
|
||
|
||
---
|
||
|
||
### 3.9 SysConfigController — 系统配置
|
||
|
||
**基础路径**: `/api/config`
|
||
|
||
| 方法 | 路径 | 说明 | 审计日志 |
|
||
|------|------|------|----------|
|
||
| GET | `/` | 获取所有配置项 | - |
|
||
| GET | `/{configKey}` | 根据键获取配置 | - |
|
||
| PUT | `/{configKey}` | 更新单个配置 | UPDATE |
|
||
| PUT | `/` | 批量更新配置 | UPDATE |
|
||
|
||
---
|
||
|
||
## 四、业务规则
|
||
|
||
### 4.1 RBAC 权限模型
|
||
|
||
**模型结构**:User ←M2M→ Role ←M2M→ Permission
|
||
|
||
**双层角色分配**:
|
||
1. **用户直接角色**:通过 `auth_user_role` 表关联,用户创建时或通过 UserController.assignRoles 分配
|
||
2. **项目员工角色**:通过 `ProjectStaffRole` 关联,项目成员管理时分配
|
||
|
||
**登录时角色收集**:
|
||
```
|
||
用户所有角色 = 用户直接角色 ∪ 项目员工角色
|
||
```
|
||
|
||
**角色类型与数据范围**:
|
||
|
||
| 角色类型 | 说明 | 数据范围 |
|
||
|---------|------|---------|
|
||
| SYSTEM | 系统级角色,跨项目 | ALL |
|
||
| PROJECT | 项目级角色,绑定特定项目 | PROJECT |
|
||
| DEPARTMENT | 部门级角色 | DEPARTMENT |
|
||
|
||
### 4.2 四级数据范围
|
||
|
||
| 数据范围 | 编码 | 说明 | 实际效果 |
|
||
|---------|------|------|---------|
|
||
| 全部 | ALL | 可查看所有数据 | 不做数据过滤 |
|
||
| 项目 | PROJECT | 仅可查看所属项目数据 | 过滤 project_id |
|
||
| 部门 | DEPARTMENT | 仅可查看本部门数据 | 过滤 project_id + dept_id |
|
||
| 本人 | SELF | 仅可查看本人数据 | 过滤 assigned_to/creator |
|
||
|
||
**DataScopeService 实现**:
|
||
- `canAccessAllData()`: 检查角色集中是否有 ALL 范围
|
||
- `isSelfScopeOnly()`: 检查是否所有角色都是 SELF 范围
|
||
- `getPermittedProjectIds()`: 获取用户可访问的项目ID列表
|
||
|
||
### 4.3 JWT 认证流程
|
||
|
||
**Token 生成**:
|
||
- 算法:HMAC-SHA256
|
||
- Claims:userId(subject)、username、roles 列表
|
||
- 过期时间:可配置(默认86400000ms = 24小时)
|
||
|
||
**认证流程**:
|
||
```
|
||
1. 客户端 POST /api/auth/login {username, password}
|
||
2. 检查登录锁定(Redis: login:attempt:{username})
|
||
3. 查询用户 + 验证密码(BCrypt)
|
||
4. 检查用户状态
|
||
5. 收集角色(直接角色 + 项目员工角色)
|
||
6. 生成 JWT Token
|
||
7. 返回 {token, userId, username, realName, roles}
|
||
|
||
后续请求:
|
||
1. 客户端 Header: Authorization: Bearer {token}
|
||
2. JwtTokenProvider.validateToken() 验证签名和过期
|
||
3. 解析 userId / username / roles
|
||
```
|
||
|
||
**Token 刷新**:
|
||
- POST /api/auth/refresh,需携带有效Token
|
||
- 生成新Token返回
|
||
|
||
### 4.4 登录失败锁定机制
|
||
|
||
**实现**:LoginAttemptService(基于Redis)
|
||
|
||
| 参数 | 默认值 | 说明 |
|
||
|------|--------|------|
|
||
| maxAttempts | 5 | 最大失败次数 |
|
||
| lockoutDurationMinutes | 10 | 锁定时长(分钟) |
|
||
| Key格式 | `login:attempt:{username}` | Redis Key |
|
||
|
||
**流程**:
|
||
- 每次失败:increment计数,首次设置TTL
|
||
- 达到上限:isLockedOut返回true,拒绝登录
|
||
- 登录成功:清除计数
|
||
- 手动解锁:unlock方法清除Key
|
||
|
||
### 4.5 项目隔离机制
|
||
|
||
**双层隔离**:
|
||
1. **UserProject 关联**:用户-项目多对多,记录用户参与的项目
|
||
2. **ProjectStaff 扩展**:项目员工在特定项目中的详细角色和状态
|
||
|
||
**项目上下文传递**:
|
||
- 请求头 `X-Project-ID` 携带当前项目ID
|
||
- ProjectContextInterceptor 拦截器设置 ThreadLocal
|
||
- 业务层通过 DataScopeService 过滤数据
|
||
|
||
**项目成员管理**:
|
||
- 添加成员:创建 ProjectStaff + 分配 ProjectStaffRole
|
||
- 移除成员:删除 ProjectStaff(级联删除角色关联)
|
||
- 角色分配:覆盖模式(先删后加)
|
||
|
||
### 4.6 审计日志
|
||
|
||
**记录方式**:`@OperationLog` 注解 + AOP切面
|
||
|
||
```java
|
||
@OperationLog(operation = "创建用户", module = "USER", action = AuditLog.ActionType.CREATE)
|
||
```
|
||
|
||
**异步持久化**:通过 `auditLogExecutor` 线程池异步保存,避免影响业务性能
|
||
|
||
**查询窗口**:强制限制30天,超过30天的查询自动截断起始时间
|
||
|
||
**归档策略**:90天以上日志归档(当前实现为直接删除,TODO: 导出至对象存储)
|
||
|
||
**记录模块**:USER / ROLE / PERMISSION / PROJECT / AUTH / DEPT / PROJECT_MEMBER / SYSTEM
|
||
|
||
### 4.7 密码加密与强度校验
|
||
|
||
**加密算法**:BCrypt(Spring Security PasswordEncoder)
|
||
|
||
**强度校验规则**(可配置,前缀 `password.*`):
|
||
|
||
| 规则 | 默认值 | 说明 |
|
||
|------|--------|------|
|
||
| minLength | 8 | 最小长度 |
|
||
| maxLength | 20 | 最大长度 |
|
||
| requireUppercase | true | 需要大写字母 |
|
||
| requireLowercase | true | 需要小写字母 |
|
||
| requireDigit | true | 需要数字 |
|
||
| requireSpecial | true | 需要特殊字符 |
|
||
|
||
**弱密码检测**:黑名单包含 password、123456、admin、qwerty、letmein、welcome、monkey、dragon
|
||
|
||
**旧密码兼容**:检测非BCrypt格式密码(MD5/SHA-1),强制返回false要求重置
|
||
|
||
---
|
||
|
||
## 五、前端操作流程
|
||
|
||
### 5.1 登录
|
||
|
||
**页面**:`/auth/Login.vue`
|
||
|
||
**流程**:
|
||
1. 输入用户名 + 密码
|
||
2. 调用 `POST /api/auth/login`
|
||
3. 存储 Token 到本地
|
||
4. 跳转至主页
|
||
|
||
**前端API**:`auth.ts` → `login()`, `logout()`, `getCurrentUser()`, `refreshToken()`
|
||
|
||
### 5.2 项目选择
|
||
|
||
**流程**:
|
||
1. 登录后获取用户项目列表 `GET /api/auth/users/{id}/projects`
|
||
2. 用户选择项目
|
||
3. 后续请求携带 `X-Project-ID` Header
|
||
|
||
### 5.3 用户管理
|
||
|
||
**页面**:`/system/Users.vue`, `/system/UserDetail.vue`
|
||
|
||
**操作**:
|
||
- 用户列表(分页、搜索、状态筛选)
|
||
- 创建用户(用户名、密码、真实姓名、手机号、邮箱、用户类型、部门)
|
||
- 编辑用户信息
|
||
- 删除用户
|
||
- 修改密码(需原密码)
|
||
- 分配角色(多选,覆盖模式)
|
||
- 查看用户参与的项目
|
||
|
||
**前端API**:`user.ts` → `getUsers()`, `createUser()`, `updateUser()`, `deleteUser()`, `updatePassword()`, `assignRoles()`, `getUserProjects()`
|
||
|
||
### 5.4 角色管理
|
||
|
||
**页面**:`/system/Roles.vue`
|
||
|
||
**操作**:
|
||
- 角色列表(分页、搜索)
|
||
- 创建角色(代码、名称、描述、类型、数据范围、所属项目、状态)
|
||
- 编辑角色
|
||
- 删除角色
|
||
- 为角色分配权限(多选,覆盖模式)
|
||
- 查看角色关联的用户
|
||
|
||
**前端API**:`role.ts` → `getRoles()`, `createRole()`, `updateRole()`, `deleteRole()`, `assignPermissions()`, `getRolePermissions()`, `getRoleUsers()`, `getRolesByProject()`
|
||
|
||
### 5.5 权限管理
|
||
|
||
**页面**:`/system/Permissions.vue`
|
||
|
||
**操作**:
|
||
- 权限列表(分页、搜索)
|
||
- 创建权限(代码、名称、类型、资源路径、HTTP方法、描述、父权限、排序)
|
||
- 编辑权限
|
||
- 删除权限
|
||
- 按类型筛选(MENU/BUTTON/API)
|
||
- 查看菜单权限
|
||
|
||
**前端API**:`permission.ts` → `getPermissions()`, `createPermission()`, `updatePermission()`, `deletePermission()`, `getPermissionsByModule()`
|
||
|
||
### 5.6 部门管理
|
||
|
||
**页面**:`/system/Depts.vue`
|
||
|
||
**操作**:
|
||
- 部门树展示
|
||
- 创建部门(名称、上级部门、类型、负责人、排序)
|
||
- 编辑部门
|
||
- 删除部门(需先删除子部门)
|
||
- 查看部门成员
|
||
- 按类型筛选部门
|
||
|
||
**前端API**:`dept.ts` → `getDeptTree()`, `getAllDepts()`, `createDept()`, `updateDept()`, `deleteDept()`, `getDeptMembers()`, `getDeptsByType()`
|
||
|
||
### 5.7 审计日志
|
||
|
||
**页面**:`/system/Audit.vue`
|
||
|
||
**操作**:
|
||
- 日志列表(分页、模块/操作类型/用户名/日期范围筛选)
|
||
- 查看日志统计(最近30天总量)
|
||
- 模块和操作类型下拉选项
|
||
|
||
**前端API**:`audit.ts` → `getAuditLogs()`, `getAuditModules()`, `getAuditActions()`, `getAuditStats()`
|
||
|
||
### 5.8 系统设置
|
||
|
||
**页面**:`/system/Settings.vue`
|
||
|
||
**操作**:
|
||
- 查看所有配置项(键值对)
|
||
- 单个/批量更新配置值
|
||
|
||
**前端API**:`system.ts` → `getConfig()`, `updateConfig()`
|
||
|
||
---
|
||
|
||
## 六、与原需求文档 05-AUTH.md 的差异对比
|
||
|
||
### 6.1 实体差异
|
||
|
||
| 对比项 | 原需求 05-AUTH.md | 实际代码实现 | 差异说明 |
|
||
|--------|-------------------|-------------|----------|
|
||
| **Role.type** | SYSTEM / CUSTOM | SYSTEM / PROJECT / DEPARTMENT | 实际代码使用三级分类(系统/项目/部门),而非预设/自定义 |
|
||
| **Role 业务属性** | 有 businessType、terminalType、isFrontline 字段 | 无这些字段 | 实际代码未实现角色业务属性扩展 |
|
||
| **Role.status** | enabled (Boolean) | status (RoleStatus枚举: ENABLED/DISABLED) | 实际代码使用枚举而非布尔值 |
|
||
| **Permission 结构** | 有 projectId、module、resource、action、path、component、icon、parentId(UUID)、level、apiMethod、apiPath、enabled | 无 projectId/module/resource/action/path/component/icon/parentId(UUID)/level/apiMethod/apiPath/enabled,有 parentCode(String)、resource、method | 实际代码简化了权限结构,用 parentCode 替代 parentId,缺少菜单路由属性 |
|
||
| **Permission.type** | PermissionType 枚举 (MENU/BUTTON/API) | String 类型 | 实际代码用字符串而非枚举 |
|
||
| **UserRole 关联** | 独立实体 UserRole(含 projectId、isDefault) | JPA自动管理的 M2M 中间表 auth_user_role(无额外字段) | 实际代码简化了关联,去掉了项目隔离和默认角色标记 |
|
||
| **OperationLog** | auth_operation_log 表,含 projectId、realName、description、requestBody、responseBody、responseStatus、hasError | sys_audit_log 表,含 content、params、result、targetType、targetId、executionTimeMs、status、errorMsg、tenantId | 实际代码使用了不同的表名和字段结构,增加了目标追踪和租户ID |
|
||
| **VisitorCredential** | 完整实体(auth_visitor_credential) | 不存在于 module-auth | 访客凭证未在认证模块实现 |
|
||
| **EnterpriseUser** | 未提及 | 存在,共享主键一对一 | 实际代码增加了企业员工扩展实体 |
|
||
| **ProjectStaff** | 未提及 | 存在,独立主键一对一 | 实际代码增加了项目员工扩展实体 |
|
||
| **ProjectStaffRole** | 未提及 | 存在,项目员工-角色关联 | 实际代码增加了项目级角色分配机制 |
|
||
| **Resident** | 未提及 | 存在,含认证流程 | 实际代码增加了住户实体 |
|
||
| **ResidentSpace** | 未提及 | 存在,住户-房屋关联 | 实际代码增加了住户房屋绑定 |
|
||
| **Space** | 未提及 | 存在,房屋空间 | 实际代码增加了房屋空间实体 |
|
||
| **UserProject** | 未提及 | 存在,用户-项目关联 | 实际代码增加了用户项目多对多 |
|
||
| **DataAccess** | 未提及 | 存在,细粒度数据访问控制 | 实际代码增加了数据访问授权机制 |
|
||
| **Dept** | 未提及 | 存在,树形部门结构 | 实际代码增加了部门管理 |
|
||
| **SysConfig** | 未提及 | 存在,键值对配置 | 实际代码增加了系统配置 |
|
||
| **User.userType** | 未提及 | 存在,ENTERPRISE/PROJECT_STAFF/RESIDENT/CUSTOMER | 实际代码增加了用户类型区分 |
|
||
| **User.deptId** | 未提及 | 存在 | 实际代码增加了部门关联 |
|
||
|
||
### 6.2 API 差异
|
||
|
||
| 对比项 | 原需求 05-AUTH.md | 实际代码实现 | 差异说明 |
|
||
|--------|-------------------|-------------|----------|
|
||
| **API路径前缀** | `/api/v1/auth` | `/api/auth` | 实际代码去掉了版本号 v1 |
|
||
| **认证接口** | login/logout/refreshToken/currentUser/changePassword/userPermissions | login/logout/refresh/me | 实际代码缺少 changePassword 和 userPermissions 独立端点,/me 替代 currentUser |
|
||
| **用户状态修改** | `POST /{id}/status` 独立端点 | 通过 `PUT /{id}` 更新status字段 | 实际代码合并到通用更新接口 |
|
||
| **权限树** | `GET /permissions/tree` | 未实现 | 实际代码缺少权限树端点 |
|
||
| **权限校验** | `POST /check` | 未实现 | 实际代码缺少权限校验端点 |
|
||
| **用户菜单** | `GET /users/{id}/menus` | 未实现 | 实际代码缺少用户菜单端点 |
|
||
| **用户权限查询** | `GET /users/{id}/permissions` | 未实现 | 实际代码缺少用户权限查询端点 |
|
||
| **部门管理** | 未提及 | 完整CRUD + 树 + 成员查询 | 实际代码新增了部门管理 |
|
||
| **项目成员管理** | 未提及 | 完整CRUD + 可用成员查询 | 实际代码新增了项目成员管理 |
|
||
| **数据访问授权** | 未提及 | grant/revoke/query | 实际代码新增了数据访问授权 |
|
||
| **审计日志** | 未提及 | 完整查询 + 统计 + 筛选选项 | 实际代码新增了审计日志管理 |
|
||
| **系统配置** | 未提及 | 完整CRUD + 批量更新 | 实际代码新增了系统配置管理 |
|
||
| **企业员工** | 未提及 | `GET /users/enterprise` | 实际代码新增了企业员工列表 |
|
||
| **用户项目关联** | 未提及 | 完整CRUD | 实际代码新增了用户项目关联 |
|
||
|
||
### 6.3 业务规则差异
|
||
|
||
| 对比项 | 原需求 05-AUTH.md | 实际代码实现 | 差异说明 |
|
||
|--------|-------------------|-------------|----------|
|
||
| **角色体系** | 13个预定义角色(SUPER_ADMIN到OWNER) | 角色通过数据库动态管理,无硬编码预定义 | 实际代码采用灵活的角色管理,未绑定固定角色列表 |
|
||
| **数据权限SQL生成** | DataScopeHelper 工具类生成SQL片段 | DataScopeService 提供判断方法 | 实际代码未实现SQL自动注入,仅提供判断接口 |
|
||
| **项目上下文** | ProjectContextHolder + 拦截器 | 同样实现,通过 X-Project-ID Header | 基本一致 |
|
||
| **状态驱动权限** | 工单状态→操作映射设计 | 未在认证模块实现 | 实际代码未实现状态驱动权限(应在业务模块) |
|
||
| **访客凭证** | 完整的二维码生成/验证流程 | 不存在于 module-auth | 实际代码未实现访客凭证 |
|
||
| **登录失败锁定** | 未提及 | Redis实现,5次失败锁10分钟 | 实际代码新增了登录安全机制 |
|
||
| **密码强度校验** | 未提及 | 完整的强度规则 + 弱密码检测 | 实际代码新增了密码安全策略 |
|
||
| **旧密码兼容** | 未提及 | 检测非BCrypt格式,强制重置 | 实际代码新增了密码迁移策略 |
|
||
| **审计日志** | AOP切面 + 同步保存 | AOP切面 + 异步保存 + 30天查询限制 + 90天归档 | 实际代码增强了审计日志管理 |
|
||
| **项目成员角色** | 未提及 | 双层角色(用户直接角色 + 项目员工角色) | 实际代码新增了项目级角色分配 |
|
||
| **部门类型** | 未提及 | 5种部门类型(行政/工程/安保/客服/保洁) | 实际代码新增了部门分类 |
|
||
| **住户认证** | 未提及 | 4种认证状态(未认证/待审核/已认证/已拒绝) | 实际代码新增了住户认证流程 |
|
||
| **数据访问授权** | 未提及 | 通用数据访问控制(dataType/dataId/accessType/accessId/accessLevel) | 实际代码新增了细粒度数据授权 |
|
||
|
||
### 6.4 差异总结
|
||
|
||
**实际代码相比原需求增加的功能**:
|
||
1. 多类型用户扩展(EnterpriseUser / ProjectStaff / Resident)
|
||
2. 项目成员管理(ProjectStaff + ProjectStaffRole)
|
||
3. 部门管理(树形结构 + 5种类型)
|
||
4. 住户与房屋关联(ResidentSpace + Space)
|
||
5. 数据访问授权(DataAccess)
|
||
6. 系统配置管理(SysConfig)
|
||
7. 登录失败锁定(Redis)
|
||
8. 密码强度校验 + 弱密码检测
|
||
9. 审计日志增强(异步保存、30天窗口、90天归档)
|
||
10. 用户-项目多对多关联(UserProject)
|
||
|
||
**原需求中未实现的功能**:
|
||
1. 角色业务属性(businessType / terminalType / isFrontline)
|
||
2. 权限树端点(GET /permissions/tree)
|
||
3. 权限校验端点(POST /check)
|
||
4. 用户菜单端点(GET /users/{id}/menus)
|
||
5. 用户权限查询端点(GET /users/{id}/permissions)
|
||
6. 访客凭证管理(VisitorCredential)
|
||
7. 状态驱动权限(工单状态→操作映射)
|
||
8. Permission 的菜单路由属性(path / component / icon)
|
||
9. Permission 的模块/资源/操作拆分字段(module / resource / action)
|
||
10. UserRole 关联的项目隔离和默认角色标记
|