jsharness 1.4.1 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.harness/agents/developer/contract.yaml +1 -1
- package/.harness/agents/prompt-templates.md +28 -4
- package/.harness/agents/solution-designer/contract.yaml +84 -28
- package/.harness/dev-map/backend/api-definition.md +10 -12
- package/.harness/dev-map/backend/auth-security.md +53 -28
- package/.harness/dev-map/backend/conventions-java.md +72 -60
- package/.harness/dev-map/backend/conventions.md +127 -163
- package/.harness/dev-map/backend/structure.md +142 -92
- package/.harness/dev-map/decisions.md +1 -1
- package/.harness/dev-map/frontend/structure.md +1 -1
- package/.harness/dev-map/overview.md +10 -9
- package/.harness/gate/checks/static-compliance.js +2 -2
- package/.harness/gate/checks/test-compliance.js +4 -4
- package/.harness/rules/global/coding-standard.md +15 -8
- package/.harness/rules/global/commit-convention.md +7 -0
- package/.harness/rules/global/design-document-boundary.md +115 -0
- package/.harness/rules/global/process-discipline.md +7 -0
- package/.harness/rules/global/security-baseline.md +27 -23
- package/.harness/rules/project/frontend-vue3.md +9 -0
- package/.harness/rules/project/java-backend.md +129 -22
- package/.harness/rules/project/web-specific.md +27 -14
- package/.harness/skills/architecture-designer/SKILL.md +768 -0
- package/.harness/skills/{build.md → build/SKILL.md} +7 -0
- package/.harness/skills/{code-review.md → code-review/SKILL.md} +7 -0
- package/.harness/skills/{docker-build.md → docker-build/SKILL.md} +7 -0
- package/.harness/skills/{docs-update.md → docs-update/SKILL.md} +7 -0
- package/.harness/skills/{java-build.md → java-build/SKILL.md} +12 -2
- package/.harness/skills/{lint-check.md → lint-check/SKILL.md} +7 -0
- package/.harness/skills/{task-board-maintenance.md → task-board-maintenance/SKILL.md} +7 -0
- package/.harness/skills/{test-api.md → test-api/SKILL.md} +21 -14
- package/.harness/skills/{test-e2e.md → test-e2e/SKILL.md} +7 -0
- package/.harness/skills/{test-unit.md → test-unit/SKILL.md} +50 -44
- package/.harness/skills/{vue-frontend-build.md → vue-frontend-build/SKILL.md} +11 -0
- package/.harness/workflow/definition.yaml +37 -3
- package/bin/jsharness.js +1 -0
- package/lib/index.mjs +428 -31
- package/package.json +2 -1
|
@@ -57,7 +57,7 @@ Step 9: 创建 PR/MR(附上变更说明)
|
|
|
57
57
|
| 维度 | 前端标准 | 后端 (Java) 标准 | 引用规则 |
|
|
58
58
|
|------|---------|----------------|----------|
|
|
59
59
|
| 类型安全 | strict mode, no `any` | 泛型 + 无 RawType + Optional 非空检查 | coding-standard A3/A28 |
|
|
60
|
-
| 函数复杂度 | ≤ 50 行, 圈复杂度 ≤ 10 | ≤ 80 行, 圈复杂度 ≤
|
|
60
|
+
| 函数复杂度 | ≤ 50 行, 圈复杂度 ≤ 10 | ≤ 80 行, 圈复杂度 ≤ 10 | coding-standard A03 |
|
|
61
61
|
| 测试覆盖率 | 新代码 ≥ 85% (Vitest) | 新代码 ≥ 80% (JaCoCo) | test-unit / java-backend §13 |
|
|
62
62
|
| 提交规范 | Conventional Commits | Conventional Commits | commit-convention |
|
|
63
63
|
| 安全合规 | 无硬编码凭证、参数化查询 | SM4 加密存储、SQL 预编译、脱敏返回 | security-baseline / java-backend §11 |
|
|
@@ -97,6 +97,7 @@
|
|
|
97
97
|
- 你负责基于需求文档输出完整的技术方案
|
|
98
98
|
- 你是连接"做什么"和"怎么实现"的关键环节
|
|
99
99
|
- 你的方案将直接指导开发者的编码工作
|
|
100
|
+
- 你在架构设计阶段引用 architecture-designer skill 获取完整设计模板
|
|
100
101
|
|
|
101
102
|
## 你的输入
|
|
102
103
|
- 需求文档(来自需求分析师)
|
|
@@ -106,25 +107,45 @@
|
|
|
106
107
|
|
|
107
108
|
## 你的输出(必须全部交付)
|
|
108
109
|
1. 技术设计文档(design-{task-id}.md)
|
|
110
|
+
- **必须先判断需求复杂度**(简单 vs 复杂,参见 design-document-boundary 规则 §3)
|
|
111
|
+
- 简单需求(< 3000 行):简化模板,单体架构,Context+Container 层
|
|
112
|
+
- 复杂需求(≥ 3000 行):完整模板,C4模型+限界上下文+领域模型
|
|
109
113
|
- 架构设计、接口定义、数据模型
|
|
110
|
-
-
|
|
114
|
+
- 关键实现逻辑(文字描述,非代码)
|
|
111
115
|
- 影响面分析和风险
|
|
112
|
-
2. API 定义(api-definition.yaml
|
|
113
|
-
3. 数据模型设计(data-model.md
|
|
116
|
+
2. API 定义(api-definition.yaml)— 每服务独立 OpenAPI 3.0 YAML
|
|
117
|
+
3. 数据模型设计(data-model.md)— ER图 + 领域模型描述
|
|
114
118
|
4. 如有新的技术决策 → ADR 记录
|
|
115
119
|
|
|
116
120
|
## 你的约束
|
|
117
121
|
- ❌ 不写可执行代码
|
|
118
122
|
- ❌ 不修改需求文档
|
|
119
123
|
- ❌ 不做最终可行性判决(那是闸门的活)
|
|
124
|
+
- ❌ 设计文档禁止包含代码/测试/监控/日志/部署/数据库优化(参见 design-document-boundary 规则)
|
|
120
125
|
- ✅ 必须参考 dev-map 中的已有约定
|
|
121
126
|
- ✅ 接口定义必须足够详细,可供开发者和测试者直接使用
|
|
127
|
+
- ✅ 必须先判断需求复杂度再选择设计深度
|
|
128
|
+
- ✅ 引用 architecture-designer skill 获取 C4模型、领域模型、类图等完整设计规范
|
|
122
129
|
|
|
123
130
|
## 设计原则
|
|
124
131
|
- 优先复用 dev-map 中的已有模式
|
|
125
|
-
- 接口设计遵循 RESTful 规范
|
|
132
|
+
- 接口设计遵循 RESTful 规范 + OpenAPI 3.0
|
|
126
133
|
- 考虑向前兼容性
|
|
127
134
|
- 注明所有假设条件和依赖
|
|
135
|
+
- 支持国产化:数据库选型明确 MySQL/达梦 DM8,国产化场景优先达梦
|
|
136
|
+
|
|
137
|
+
## 技术栈
|
|
138
|
+
- 后端: Spring Boot 3.x + JDK21 + MyBatis-Plus + Nacos 3.0
|
|
139
|
+
- 数据库: MySQL 8.0 / 达梦 DM8(国产化场景)
|
|
140
|
+
- 缓存: Redis
|
|
141
|
+
- 前端: Vue3 + TypeScript + Element Plus
|
|
142
|
+
|
|
143
|
+
## 关键参考文件
|
|
144
|
+
- skills/architecture-designer/SKILL.md — 架构设计完整模板
|
|
145
|
+
- rules/global/design-document-boundary.md — 设计文档边界约束 + 复杂度分流
|
|
146
|
+
- rules/project/java-backend.md — 后端编码规范
|
|
147
|
+
- rules/project/frontend-vue3.md — 前端编码规范
|
|
148
|
+
- rules/global/security-baseline.md — 安全红线
|
|
128
149
|
```
|
|
129
150
|
|
|
130
151
|
---
|
|
@@ -237,6 +258,9 @@
|
|
|
237
258
|
- JDK21 虚拟线程中 **禁止 synchronized**,改用 ReentrantLock
|
|
238
259
|
- 事务范围最小化,外部 HTTP/文件操作放事务外
|
|
239
260
|
- 敏感数据 SM4 加密存储,API 返回脱敏
|
|
261
|
+
- 数据库选型:MySQL 8.0 / 达梦 DM8(国产化场景),设计文档必须明确标注
|
|
262
|
+
- 服务注册到 Nacos 3.0,配置从 Nacos 动态拉取
|
|
263
|
+
- 服务级别标注 L0-L3,核心服务必须高可用
|
|
240
264
|
- **参考规则**: `.harness/rules/project/java-backend.md`
|
|
241
265
|
```
|
|
242
266
|
|
|
@@ -9,28 +9,36 @@ max_turns: 15 # 方案设计可能需要深入讨论
|
|
|
9
9
|
|
|
10
10
|
### 主要职责
|
|
11
11
|
1. **技术方案设计** — 基于需求文档输出完整的技术方案
|
|
12
|
-
2.
|
|
13
|
-
3.
|
|
14
|
-
4.
|
|
15
|
-
5.
|
|
12
|
+
2. **架构设计** — 引用 architecture-designer skill 进行 C4 模型、限界上下文、领域模型设计
|
|
13
|
+
3. **接口设计** — 定义前后端接口契约(OpenAPI 3.0 / API Schema)
|
|
14
|
+
4. **数据模型设计** — 定义数据库表结构、关系和 ER 图
|
|
15
|
+
5. **风险评估** — 识别技术风险点和应对策略
|
|
16
|
+
6. **dev-map 参考** — 查阅现有模块,避免重复造轮子
|
|
16
17
|
|
|
17
18
|
### 输入
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
19
|
+
|| 输入来源 | 格式 | 说明 |
|
|
20
|
+
||----------|------|------|
|
|
21
|
+
|| 需求文档 | requirements-{id}.md | 需求分析师的产出 |
|
|
22
|
+
|| 验收标准 | acceptance-criteria.md | 需要满足的条件 |
|
|
23
|
+
|| dev-map 现有架构 | dev-map/**/* | 既有模块和模式参考 |
|
|
24
|
+
|| ADR 决策记录 | dev-map/decisions.md | 已有的重要技术决策 |
|
|
24
25
|
|
|
25
26
|
### 输出(必须交付物)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
|| 产出物 | 格式 | 说明 |
|
|
28
|
+
||--------|------|------|
|
|
29
|
+
|| **技术设计文档** | design-{task-id}.md | 完整的技术方案(参见 architecture-designer skill 模板)|
|
|
30
|
+
|| **API 定义** | api-definition.yaml | OpenAPI 3.0 规范(每服务独立文件)|
|
|
31
|
+
|| **数据模型** | data-model.md | ER 图 + 领域模型描述 + 迁移计划 |
|
|
32
|
+
|| **技术决策记录** | decisions.md | 本方案中的 ADR(如有新决策)|
|
|
32
33
|
|
|
33
34
|
### 技术设计文档模板
|
|
35
|
+
|
|
36
|
+
> **重要**: 完整的模板、C4 架构图规范、领域模型设计规范参见 `skills/architecture-designer/SKILL.md`
|
|
37
|
+
> 以下为文档结构概要,具体内容格式以 skill 为准。
|
|
38
|
+
|
|
39
|
+
**第一步**: 判断需求复杂度(参见 `rules/global/design-document-boundary.md` §3)
|
|
40
|
+
|
|
41
|
+
**简单需求**(预估 < 3000 行)模板:
|
|
34
42
|
```markdown
|
|
35
43
|
# 技术设计方案:{需求标题}
|
|
36
44
|
|
|
@@ -38,38 +46,86 @@ max_turns: 15 # 方案设计可能需要深入讨论
|
|
|
38
46
|
- 一句话总结方案
|
|
39
47
|
- 涉及的技术栈和组件
|
|
40
48
|
|
|
41
|
-
## 2.
|
|
42
|
-
- 整体架构图(
|
|
49
|
+
## 2. 架构设计(简化)
|
|
50
|
+
- 整体架构图(Context + Container 层)
|
|
43
51
|
- 组件职责划分
|
|
44
52
|
- 数据流向
|
|
45
53
|
|
|
46
54
|
## 3. 接口设计
|
|
47
55
|
- RESTful API 端点列表
|
|
48
56
|
- 请求/响应格式
|
|
49
|
-
- 错误码定义
|
|
50
57
|
|
|
51
58
|
## 4. 数据模型
|
|
52
|
-
-
|
|
53
|
-
-
|
|
59
|
+
- ER 图
|
|
60
|
+
- 表结构设计
|
|
54
61
|
- 索引策略
|
|
55
62
|
|
|
56
63
|
## 5. 关键实现逻辑
|
|
57
|
-
-
|
|
58
|
-
- 状态机定义(如果有)
|
|
59
|
-
- 并发控制策略
|
|
64
|
+
- 核心流程的文字描述(非代码)
|
|
60
65
|
|
|
61
66
|
## 6. 影响面分析
|
|
62
|
-
- 需要修改的现有文件
|
|
63
|
-
- 可能影响的其他功能
|
|
64
|
-
- 数据库迁移脚本
|
|
65
67
|
|
|
66
68
|
## 7. 风险与缓解
|
|
67
|
-
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**复杂需求**(预估 ≥ 3000 行)模板:
|
|
72
|
+
```markdown
|
|
73
|
+
# 技术设计方案:{需求标题}
|
|
74
|
+
|
|
75
|
+
## 1. 概述
|
|
76
|
+
- 一句话总结方案
|
|
77
|
+
- 技术栈选择理由
|
|
78
|
+
|
|
79
|
+
## 2. 用例图
|
|
80
|
+
- UML UseCase 图(Mermaid)
|
|
81
|
+
- 关键用例描述
|
|
82
|
+
|
|
83
|
+
## 3. 架构设计
|
|
84
|
+
- C4 模型(Context → Container → Component 三层)
|
|
85
|
+
- 架构分层(表示层/业务层/数据层)
|
|
86
|
+
|
|
87
|
+
## 4. 限界上下文划分
|
|
88
|
+
- 上下文映射图
|
|
89
|
+
- 上下文间通信方式
|
|
90
|
+
|
|
91
|
+
## 5. 服务设计
|
|
92
|
+
- 服务拆分表(含服务级别 L0-L3)
|
|
93
|
+
- 服务间通信(同步/异步)
|
|
94
|
+
|
|
95
|
+
## 6. 领域模型设计
|
|
96
|
+
- 聚合根、实体、值对象描述
|
|
97
|
+
- 领域事件定义
|
|
98
|
+
- 领域模型到 ER 图映射
|
|
99
|
+
|
|
100
|
+
## 7. 接口设计
|
|
101
|
+
- 每服务独立 OpenAPI 3.0 YAML
|
|
102
|
+
- 统一响应格式
|
|
103
|
+
|
|
104
|
+
## 8. 数据模型
|
|
105
|
+
- ER 图
|
|
106
|
+
- 表结构设计(含通用字段)
|
|
107
|
+
- 索引策略
|
|
108
|
+
|
|
109
|
+
## 9. 类图设计
|
|
110
|
+
- 核心聚合根类图
|
|
111
|
+
- 仓储接口类图
|
|
112
|
+
|
|
113
|
+
## 10. 数据架构
|
|
114
|
+
- 数据存储策略
|
|
115
|
+
- 数据一致性策略
|
|
116
|
+
- 数据库选型(MySQL / 达梦 DM8)
|
|
117
|
+
|
|
118
|
+
## 11. 影响面分析
|
|
119
|
+
|
|
120
|
+
## 12. 风险与缓解
|
|
68
121
|
```
|
|
69
122
|
|
|
70
123
|
## 边界约束
|
|
71
124
|
- ❌ 不写可执行的实现代码(那是开发者的事)
|
|
72
125
|
- ❌ 不修改需求文档内容(走变更请求流程)
|
|
73
126
|
- ❌ 不做最终可行性判决(那是闸门的职责)
|
|
127
|
+
- ❌ 设计文档禁止包含代码/测试/监控/日志/部署/数据库优化(参见 `rules/global/design-document-boundary.md`)
|
|
74
128
|
- ✅ 必须参考 dev-map 中已有的模式和约定
|
|
75
129
|
- ✅ 必须定义清晰的接口契约供开发和测试使用
|
|
130
|
+
- ✅ 必须先判断需求复杂度再选择设计深度(简单 vs 复杂模板)
|
|
131
|
+
- ✅ 引用 `skills/architecture-designer/SKILL.md` 获取完整设计模板和规范
|
|
@@ -25,7 +25,7 @@ POST /api/v1/orders/:id/cancel # 取消订单
|
|
|
25
25
|
POST /api/v1/auth/refresh # 刷新 Token
|
|
26
26
|
|
|
27
27
|
# 过滤/排序/分页
|
|
28
|
-
GET /api/v1/users?role=admin&
|
|
28
|
+
GET /api/v1/users?role=admin&pageNo=1&pageSize=20&sort=createdAt-desc
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
### 统一响应格式
|
|
@@ -34,7 +34,7 @@ GET /api/v1/users?role=admin&page=1&pageSize=20&sort=createdAt-desc
|
|
|
34
34
|
|
|
35
35
|
```json
|
|
36
36
|
{
|
|
37
|
-
"code":
|
|
37
|
+
"code": 200,
|
|
38
38
|
"data": { ... },
|
|
39
39
|
"message": "success",
|
|
40
40
|
"timestamp": 1700000000000
|
|
@@ -45,15 +45,13 @@ GET /api/v1/users?role=admin&page=1&pageSize=20&sort=createdAt-desc
|
|
|
45
45
|
|
|
46
46
|
```json
|
|
47
47
|
{
|
|
48
|
-
"code":
|
|
48
|
+
"code": 200,
|
|
49
49
|
"data": {
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
"totalPages": 8
|
|
56
|
-
}
|
|
50
|
+
"list": [ ... ],
|
|
51
|
+
"total": 150,
|
|
52
|
+
"pageNo": 1,
|
|
53
|
+
"pageSize": 20,
|
|
54
|
+
"pages": 8
|
|
57
55
|
},
|
|
58
56
|
"message": "success",
|
|
59
57
|
"timestamp": 1700000000000
|
|
@@ -64,7 +62,7 @@ GET /api/v1/users?role=admin&page=1&pageSize=20&sort=createdAt-desc
|
|
|
64
62
|
|
|
65
63
|
```json
|
|
66
64
|
{
|
|
67
|
-
"code":
|
|
65
|
+
"code": 400,
|
|
68
66
|
"message": "参数校验失败",
|
|
69
67
|
"details": [
|
|
70
68
|
{
|
|
@@ -99,7 +97,7 @@ GET /api/v1/users?role=admin&page=1&pageSize=20&sort=createdAt-desc
|
|
|
99
97
|
|
|
100
98
|
| 参数 | 类型 | 默认值 | 说明 |
|
|
101
99
|
|------|------|--------|------|
|
|
102
|
-
| `
|
|
100
|
+
| `pageNo` | integer | 1 | 页码(从 1 开始)|
|
|
103
101
|
| `pageSize` | integer | 20 | 每页数量(最大 100)|
|
|
104
102
|
| `sort` | string | `-createdAt` | 排序字段(`-` 表示降序)|
|
|
105
103
|
|
|
@@ -62,21 +62,42 @@
|
|
|
62
62
|
| `viewer` | 只读访问 | 只读用户 |
|
|
63
63
|
| `user` | 自身数据的读写 | 普通注册用户 |
|
|
64
64
|
|
|
65
|
-
###
|
|
66
|
-
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
@
|
|
70
|
-
@
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
65
|
+
### Spring Security 权限校验实现
|
|
66
|
+
|
|
67
|
+
```java
|
|
68
|
+
// ========== 权限注解使用 ==========
|
|
69
|
+
@RestController
|
|
70
|
+
@RequestMapping("/api/v1/admin/users")
|
|
71
|
+
@RequiredArgsConstructor
|
|
72
|
+
public class AdminUserController {
|
|
73
|
+
|
|
74
|
+
@PreAuthorize("hasRole('ADMIN') or hasRole('SUPER_ADMIN')")
|
|
75
|
+
@GetMapping
|
|
76
|
+
@Operation(summary = "分页查询用户(后台管理)")
|
|
77
|
+
public CommonResult<PageResult<UserRespVO>> page(@Valid UserPageReqVO reqVO) {
|
|
78
|
+
return success(userService.getUserPage(reqVO));
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
@PreAuthorize("hasRole('SUPER_ADMIN')")
|
|
82
|
+
@DeleteMapping("/{id}")
|
|
83
|
+
@Operation(summary = "删除用户")
|
|
84
|
+
public CommonResult<Boolean> delete(@PathVariable("id") Long id) {
|
|
85
|
+
userService.deleteUser(id);
|
|
86
|
+
return success(true);
|
|
87
|
+
}
|
|
75
88
|
}
|
|
76
89
|
|
|
77
|
-
|
|
78
|
-
@
|
|
79
|
-
|
|
90
|
+
// ========== 方法级资源权限校验 ==========
|
|
91
|
+
@Service
|
|
92
|
+
@RequiredArgsConstructor
|
|
93
|
+
public class ProjectServiceImpl implements ProjectService {
|
|
94
|
+
|
|
95
|
+
@Override
|
|
96
|
+
@PreAuthorize("hasPermission(#projectId, 'project', 'edit')")
|
|
97
|
+
public void updateProject(Long projectId, ProjectUpdateReqVO reqVO) {
|
|
98
|
+
// 只有项目成员才能编辑
|
|
99
|
+
}
|
|
100
|
+
}
|
|
80
101
|
```
|
|
81
102
|
|
|
82
103
|
### 权限矩阵
|
|
@@ -90,42 +111,46 @@ deletePost() {}
|
|
|
90
111
|
| 数据查看 | ✅ | ✅ | ✅ | ✅ | 自身 |
|
|
91
112
|
| 系统配置 | ✅ | ❌ | ❌ | ❌ | ❌ |
|
|
92
113
|
|
|
93
|
-
##
|
|
114
|
+
## Spring Security 过滤器链
|
|
94
115
|
|
|
95
116
|
```
|
|
96
117
|
请求进入
|
|
97
118
|
│
|
|
98
|
-
├──
|
|
119
|
+
├── SecurityHeadersFilter (安全头设置)
|
|
99
120
|
│ ├── X-Frame-Options: DENY
|
|
100
121
|
│ ├── X-Content-Type-Options: nosniff
|
|
101
122
|
│ └── X-XSS-Protection: 1; mode=block
|
|
102
123
|
│
|
|
103
|
-
├──
|
|
124
|
+
├── RateLimitFilter (速率限制 — 基于 Redis + Redisson)
|
|
104
125
|
│ ├── 全局: 100 req/min
|
|
105
126
|
│ ├── 登录: 5 req/min (同一 IP)
|
|
106
127
|
│ └── API: 60 req/min (同一用户)
|
|
107
128
|
│
|
|
108
|
-
├──
|
|
129
|
+
├── CorsFilter (跨域控制 — Spring 配置)
|
|
109
130
|
│ ├── Allow-Origin: [白名单]
|
|
110
131
|
│ ├── Allow-Methods: GET,POST,PUT,DELETE
|
|
111
132
|
│ └── Credentials: true
|
|
112
133
|
│
|
|
113
|
-
├──
|
|
114
|
-
│ ├── 白名单路径跳过: /health, /public
|
|
115
|
-
│ └──
|
|
134
|
+
├── JwtAuthenticationFilter (JWT 认证)
|
|
135
|
+
│ ├── 白名单路径跳过: /health, /public/*, /api/v1/auth/login
|
|
136
|
+
│ └── 解析 Token → 设置 SecurityContext
|
|
116
137
|
│
|
|
117
|
-
└──
|
|
118
|
-
├── 检查用户角色是否匹配
|
|
138
|
+
└── @PreAuthorize (方法级鉴权)
|
|
139
|
+
├── 检查用户角色是否匹配
|
|
119
140
|
└── 不匹配 → 403 Forbidden
|
|
120
141
|
```
|
|
121
142
|
|
|
122
143
|
## 安全 Checklist
|
|
123
144
|
|
|
124
|
-
- [ ]
|
|
145
|
+
- [ ] 所有敏感接口都有认证保护(`@PreAuthorize`)
|
|
125
146
|
- [ ] Password 使用 bcrypt (cost ≥ 12) 哈希存储
|
|
126
|
-
- [ ]
|
|
147
|
+
- [ ] 敏感数据(手机号/身份证)使用国密 SM4 加密存储
|
|
148
|
+
- [ ] Refresh Token 支持吊销(logout 时从 DB 删除)
|
|
127
149
|
- [ ] 登录限制:连续 5 次失败锁定 15 分钟
|
|
128
|
-
- [ ] CSRF
|
|
129
|
-
- [ ] SQL
|
|
130
|
-
- [ ] XSS
|
|
131
|
-
- [ ] 日志脱敏:不记录 password/token
|
|
150
|
+
- [ ] CSRF 防护:SameSite Cookie 或 CSRF Token
|
|
151
|
+
- [ ] SQL 注入防护:MyBatis 全部使用 `#{}` 预编译参数绑定
|
|
152
|
+
- [ ] XSS 防护:响应数据脱敏、CSP 策略
|
|
153
|
+
- [ ] 日志脱敏:不记录 password/token/手机号明文等敏感字段
|
|
154
|
+
- [ ] API 响应脱敏:手机号中间4位*、身份证中间*、密码返回 null
|
|
155
|
+
- [ ] Redis key 必须设置 TTL,禁止永不过期
|
|
156
|
+
- [ ] 虚拟线程中禁止使用 synchronized,改用 ReentrantLock
|