jsharness 1.5.0 → 1.8.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/code-reviewer.md +81 -0
- package/.harness/agents/developer.md +101 -0
- package/.harness/agents/gate-controller.md +77 -0
- package/.harness/agents/project-manager.md +77 -0
- package/.harness/agents/prompt-templates.md +28 -4
- package/.harness/agents/requirements-analyst.md +90 -0
- package/.harness/agents/solution-designer.md +86 -0
- package/.harness/agents/tester.md +105 -0
- package/.harness/commands/js/build-gates-frontend.md +33 -0
- package/.harness/commands/js/build-gates-java.md +33 -0
- package/.harness/commands/js/build-gates.md +32 -0
- package/.harness/commands/js/engineering-consistency.md +29 -0
- package/.harness/commands/js/security-quality.md +27 -0
- package/.harness/commands/js/static-compliance.md +35 -0
- package/.harness/commands/js/task-board-maintenance.md +68 -0
- package/.harness/commands/js/test-compliance.md +30 -0
- 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} +12 -1
- 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 +9 -4
- package/files/AI_RULE.md +185 -0
- package/files/architecture-designer.md +1334 -0
- package/files/frontend-project-conventions/SKILL.md +125 -0
- package/files/java-backend-coding-standards/SKILL.md +536 -0
- package/files//345/205/254/345/217/270harness.txt +1818 -0
- package/lib/index.mjs +946 -111
- package/package.json +63 -53
- package/.harness/agents/code-reviewer/contract.yaml +0 -64
- package/.harness/agents/developer/contract.yaml +0 -72
- package/.harness/agents/gate-controller/contract.yaml +0 -64
- package/.harness/agents/project-manager/contract.yaml +0 -77
- package/.harness/agents/requirements-analyst/contract.yaml +0 -64
- package/.harness/agents/solution-designer/contract.yaml +0 -75
- package/.harness/agents/tester/contract.yaml +0 -92
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: build-gates-frontend
|
|
3
|
+
description: 前端构建门槛 — TypeScript 类型检查、依赖完整性、构建验证、ESLint
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 前端构建门槛 (Frontend Build Gates)
|
|
7
|
+
|
|
8
|
+
> **源文件**: `.harness/gate/checks/build-gates-frontend.js`
|
|
9
|
+
> **类别**: B 类 — 构建门槛 (前端)
|
|
10
|
+
|
|
11
|
+
适用于 `package.json` 存在的项目(Vue3/Vite 等)。
|
|
12
|
+
|
|
13
|
+
## 检查项
|
|
14
|
+
|
|
15
|
+
| 编号 | 检查项 | 说明 | 阻塞 |
|
|
16
|
+
|------|--------|------|------|
|
|
17
|
+
| F-B1 | TypeScript 类型检查 | `tsc --noEmit` | 是 |
|
|
18
|
+
| F-B2 | 依赖完整性检查 | `npm/pnpm ls` | 是 |
|
|
19
|
+
| F-B3 | 前端构建 | `npm run build` | 是 |
|
|
20
|
+
| F-B4 | ESLint 快速检查 | `npx eslint` | 是 |
|
|
21
|
+
| F-B5 | npm 安全审计 | `npm audit` | 否(可选) |
|
|
22
|
+
|
|
23
|
+
## 通过条件
|
|
24
|
+
|
|
25
|
+
- F-B1 ~ F-B4 全部 PASS
|
|
26
|
+
- 无 HIGH/CRITICAL 安全漏洞(F-B5 可选)
|
|
27
|
+
|
|
28
|
+
## 失败条件
|
|
29
|
+
|
|
30
|
+
- TypeScript 编译错误 → FAIL
|
|
31
|
+
- 依赖缺失或版本冲突 → FAIL
|
|
32
|
+
- 构建失败 → FAIL
|
|
33
|
+
- ESLint 存在 error → FAIL
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: build-gates-java
|
|
3
|
+
description: Java 后端构建门槛 — Maven 编译、单元测试、Checkstyle、依赖分析
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Java 后端构建门槛 (Java Build Gates)
|
|
7
|
+
|
|
8
|
+
> **源文件**: `.harness/gate/checks/build-gates-java.js`
|
|
9
|
+
> **类别**: B 类 — 构建门槛 (Java)
|
|
10
|
+
|
|
11
|
+
适用于 `pom.xml` 存在的 Spring Boot / Maven 项目(JDK21 + Spring Boot)。
|
|
12
|
+
|
|
13
|
+
## 检查项
|
|
14
|
+
|
|
15
|
+
| 编号 | 检查项 | 说明 | 阻塞 |
|
|
16
|
+
|------|--------|------|------|
|
|
17
|
+
| J-B1 | Maven 编译检查 | `mvn clean compile` | 是 |
|
|
18
|
+
| J-B2 | 单元测试快速验证 | `mvn test` | 是 |
|
|
19
|
+
| J-B3 | Checkstyle 代码风格检查 | `mvn checkstyle:check` | 是 |
|
|
20
|
+
| J-B4 | 依赖树分析 | `mvn dependency:tree` | 否 |
|
|
21
|
+
| J-B5 | SpotBugs Bug 扫描 | `mvn spotbugs:check` | 否(可选) |
|
|
22
|
+
| J-B6 | JaCoCo 覆盖率门禁 | `mvn jacoco:check` | 否(可选) |
|
|
23
|
+
|
|
24
|
+
## 通过条件
|
|
25
|
+
|
|
26
|
+
- J-B1 ~ J-B3 全部 PASS
|
|
27
|
+
- 编译零错误,单元测试全部通过
|
|
28
|
+
|
|
29
|
+
## 失败条件
|
|
30
|
+
|
|
31
|
+
- Maven 编译失败 → FAIL
|
|
32
|
+
- 单元测试失败 → FAIL
|
|
33
|
+
- Checkstyle 违规 → FAIL
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: build-gates
|
|
3
|
+
description: 构建门槛检查 — 自动检测项目类型并分发到对应的门禁检查模块
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 构建门槛检查 (Build Gates)
|
|
7
|
+
|
|
8
|
+
> **源文件**: `.harness/gate/checks/build-gates.js`
|
|
9
|
+
> **类别**: B 类 — 构建门槛
|
|
10
|
+
|
|
11
|
+
自动检测项目类型并分发到对应的门禁检查模块:
|
|
12
|
+
- 检测到 `pom.xml` → 调用 build-gates-java.js (Maven/Java)
|
|
13
|
+
- 检测到 `package.json` → 调用 build-gates-frontend.js (Node/前端)
|
|
14
|
+
- 都没有 → 返回 warning
|
|
15
|
+
|
|
16
|
+
## 检查项
|
|
17
|
+
|
|
18
|
+
| 编号 | 检查项 | 说明 |
|
|
19
|
+
|------|--------|------|
|
|
20
|
+
| B1 | 项目类型检测 | 检测 pom.xml / package.json 确定项目类型 |
|
|
21
|
+
| B2 | 前端构建 | TypeScript 类型检查 + 依赖完整性 + npm run build + ESLint |
|
|
22
|
+
| B3 | Java 构建 | Maven 编译 + 单元测试 + Checkstyle + 依赖树分析 |
|
|
23
|
+
|
|
24
|
+
## 通过条件
|
|
25
|
+
|
|
26
|
+
- 项目类型检测成功(Java 或 Frontend)
|
|
27
|
+
- 对应子模块的构建检查全部 PASS
|
|
28
|
+
|
|
29
|
+
## 失败条件
|
|
30
|
+
|
|
31
|
+
- 无法检测项目类型 → WARNING
|
|
32
|
+
- 子模块构建失败 → FAIL
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: engineering-consistency
|
|
3
|
+
description: 工程一致性检查 — CHANGELOG 更新、dev-map 一致性、配置同步
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 工程一致性检查 (Engineering Consistency)
|
|
7
|
+
|
|
8
|
+
> **源文件**: `.harness/gate/checks/engineering-consistency.js`
|
|
9
|
+
> **类别**: E 类 — 工程一致性
|
|
10
|
+
|
|
11
|
+
## 检查项
|
|
12
|
+
|
|
13
|
+
| 编号 | 检查项 | 说明 |
|
|
14
|
+
|------|--------|------|
|
|
15
|
+
| E1 | CHANGELOG 更新检查 | 检查 Unreleased 区域是否有内容 |
|
|
16
|
+
| E2 | dev-map 一致性检查 | 检查 dev-map 与实际代码是否一致 |
|
|
17
|
+
| E3 | 配置同步检查 | 检查各配置文件是否同步 |
|
|
18
|
+
|
|
19
|
+
## 通过条件
|
|
20
|
+
|
|
21
|
+
- CHANGELOG Unreleased 区域有内容
|
|
22
|
+
- dev-map 与代码一致
|
|
23
|
+
- 配置文件同步
|
|
24
|
+
|
|
25
|
+
## 失败条件
|
|
26
|
+
|
|
27
|
+
- CHANGELOG 未更新 → WARNING
|
|
28
|
+
- dev-map 不一致 → WARNING
|
|
29
|
+
- 配置不同步 → WARNING
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: security-quality
|
|
3
|
+
description: 安全与质量检查 — CVE 依赖审计、Code Review Approval 状态
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 安全与质量检查 (Security & Quality)
|
|
7
|
+
|
|
8
|
+
> **源文件**: `.harness/gate/checks/security-quality.js`
|
|
9
|
+
> **类别**: D 类 — 安全与质量
|
|
10
|
+
|
|
11
|
+
## 检查项
|
|
12
|
+
|
|
13
|
+
| 编号 | 检查项 | 说明 |
|
|
14
|
+
|------|--------|------|
|
|
15
|
+
| D1 | npm audit 安全审计 | 检测 CVE 漏洞(HIGH/CRITICAL 级别) |
|
|
16
|
+
| D2 | Code Review Approval | 检查代码审查状态(通过 Git 信息判断) |
|
|
17
|
+
|
|
18
|
+
## 通过条件
|
|
19
|
+
|
|
20
|
+
- 安全评分 ≥ 80 分
|
|
21
|
+
- 无 CRITICAL 级别 CVE 漏洞
|
|
22
|
+
- HIGH 级别漏洞有修复计划
|
|
23
|
+
|
|
24
|
+
## 失败条件
|
|
25
|
+
|
|
26
|
+
- 存在 CRITICAL 级别漏洞 → FAIL
|
|
27
|
+
- 安全评分 < 60 分 → FAIL
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: static-compliance
|
|
3
|
+
description: 静态合规检查 — ESLint、Prettier、console.log 残留、硬编码字符串、Secret 泄露检测
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 静态合规检查 (Static Compliance)
|
|
7
|
+
|
|
8
|
+
> **源文件**: `.harness/gate/checks/static-compliance.js`
|
|
9
|
+
> **类别**: A 类 — 静态合规
|
|
10
|
+
|
|
11
|
+
## 检查项
|
|
12
|
+
|
|
13
|
+
| 编号 | 检查项 | 说明 |
|
|
14
|
+
|------|--------|------|
|
|
15
|
+
| A1 | ESLint 检查 | 零 error,零 warning |
|
|
16
|
+
| A2 | Prettier 格式化 | 格式化后无 diff 变更 |
|
|
17
|
+
| A3 | console.log / debugger 残留 | 禁止残留到生产代码 |
|
|
18
|
+
| A4 | 硬编码字符串检测 | 检测未国际化的中文字符串 |
|
|
19
|
+
| A5 | TODO/FIXME 残留 | 检测遗留的 TODO/FIXME |
|
|
20
|
+
| A6 | 命名规范检查 | 检查文件名/变量名是否符合规范 |
|
|
21
|
+
| A7 | 文件长度限制 | 单文件不超过 300 行 |
|
|
22
|
+
| A8 | Secret 泄露检测 | 检测硬编码的密钥/Token/密码 |
|
|
23
|
+
|
|
24
|
+
## 通过条件
|
|
25
|
+
|
|
26
|
+
- ESLint 零错误
|
|
27
|
+
- Prettier 格式一致
|
|
28
|
+
- 无 console.log / debugger 残留
|
|
29
|
+
- 无 Secret 泄露
|
|
30
|
+
|
|
31
|
+
## 失败条件
|
|
32
|
+
|
|
33
|
+
- ESLint 存在 error → FAIL
|
|
34
|
+
- Secret 泄露检测命中 → FAIL(安全红线)
|
|
35
|
+
- console.log / debugger 残留 → FAIL
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: task-board-maintenance
|
|
3
|
+
description: TaskBoard 维护命令 — 任务注册/状态流转/周报生成/看板同步
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
enabled: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# TaskBoard 维护 Command
|
|
9
|
+
|
|
10
|
+
> **执行角色**: PM Agent / 工作流引擎
|
|
11
|
+
> **触发时机**: 任务状态变更时、每日定时、周报生成前
|
|
12
|
+
> **源文件**: `.harness/skills/task-board-maintenance/SKILL.md` (已迁移为 command)
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 操作清单
|
|
17
|
+
|
|
18
|
+
### 1. 新任务注册
|
|
19
|
+
|
|
20
|
+
当 PM 收到新需求时:
|
|
21
|
+
|
|
22
|
+
- 分配 Task ID(格式:TASK-YYYYMMDD-NNN)
|
|
23
|
+
- 判断流程变体类型:
|
|
24
|
+
- 新功能 → 标准七阶段流程
|
|
25
|
+
- Bug 修复 → Bug 修复轻量流程
|
|
26
|
+
- P0/P1 生产问题 → 热修最快路径
|
|
27
|
+
- 文档/配置变更 → 微型流程
|
|
28
|
+
- 安全漏洞 → 安全响应流程
|
|
29
|
+
- 在「待开始任务」表添加一行
|
|
30
|
+
- 检查是否与历史任务重复
|
|
31
|
+
- 如有关联的 Issue/PR,填入对应编号
|
|
32
|
+
- 更新「新增需求」计数器
|
|
33
|
+
|
|
34
|
+
### 2. 状态推进
|
|
35
|
+
|
|
36
|
+
当一个阶段完成,需要推入下一阶段:
|
|
37
|
+
|
|
38
|
+
- 从当前区域移动目标任务到下一区域
|
|
39
|
+
- 更新「当前阶段」字段
|
|
40
|
+
- 更新「负责Agent」字段为下一个角色
|
|
41
|
+
- 更新「上次更新」为当前时间
|
|
42
|
+
- 在备注中记录简要原因
|
|
43
|
+
- 如果是打回,在「备注」中注明打回原因和来源角色
|
|
44
|
+
|
|
45
|
+
### 3. 交付归档
|
|
46
|
+
|
|
47
|
+
测试 PASS 后:
|
|
48
|
+
|
|
49
|
+
- 移动到「已完成」区域
|
|
50
|
+
- 填写「交付结论」(PASS / CONDITIONAL_PASS)
|
|
51
|
+
- 计算「实际周期」
|
|
52
|
+
- 填写「归档日期」
|
|
53
|
+
- 收集各阶段文档链接
|
|
54
|
+
- 更新度量指标
|
|
55
|
+
|
|
56
|
+
### 4. 定期维护
|
|
57
|
+
|
|
58
|
+
**每日检查**(PM Agent 自动执行):
|
|
59
|
+
- 检查是否有超时未更新的任务(超过 48 小时)
|
|
60
|
+
- 检查是否有阻塞超过 24 小时的任务
|
|
61
|
+
- 更新「最后更新」时间戳
|
|
62
|
+
|
|
63
|
+
**每周清理**(PM Agent 手动执行):
|
|
64
|
+
- 清理已取消或合并的重复条目
|
|
65
|
+
- 确认已完成任务都已正确归档
|
|
66
|
+
- 生成周度度量报告
|
|
67
|
+
- 识别瓶颈阶段
|
|
68
|
+
- 汇总流程违规情况并提出改进建议
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: test-compliance
|
|
3
|
+
description: 测试合规检查 — 单元测试执行与覆盖率、E2E 测试、API 集成测试
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 测试合规检查 (Test Compliance)
|
|
7
|
+
|
|
8
|
+
> **源文件**: `.harness/gate/checks/test-compliance.js`
|
|
9
|
+
> **类别**: C 类 — 测试合规
|
|
10
|
+
|
|
11
|
+
## 检查项
|
|
12
|
+
|
|
13
|
+
| 编号 | 检查项 | 说明 |
|
|
14
|
+
|------|--------|------|
|
|
15
|
+
| C1 | 单元测试 | `npm run test -- --coverage` |
|
|
16
|
+
| C2 | E2E 关键路径测试 | 可选 |
|
|
17
|
+
| C3 | API 集成测试 | 可选 |
|
|
18
|
+
| C4 | 测试数量对比 | 基线模式,检测测试是否减少 |
|
|
19
|
+
|
|
20
|
+
## 通过条件
|
|
21
|
+
|
|
22
|
+
- 单元测试全部 PASS
|
|
23
|
+
- 覆盖率不低于基线
|
|
24
|
+
- 测试数量未减少
|
|
25
|
+
|
|
26
|
+
## 失败条件
|
|
27
|
+
|
|
28
|
+
- 单元测试失败 → FAIL
|
|
29
|
+
- 覆盖率低于基线 → WARNING
|
|
30
|
+
- 测试数量减少 → WARNING
|
|
@@ -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
|