ether-docs/_archive/domains-old/REVERSE-AUTH.md

926 lines
37 KiB
Markdown
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.

# 认证授权域功能详细设计文档(反推自代码)
**文档类型**: 反推设计文档
**数据来源**: 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 | | 所属项目IDNULL=系统级) |
| 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 | | 上级部门IDNULL=顶级) |
| 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. 检查登录失败锁定Redis5次失败锁定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
- ClaimsuserIdsubject、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 密码加密与强度校验
**加密算法**BCryptSpring 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 关联的项目隔离和默认角色标记