---
name: developing-user-auth

description: >
  指导开发 rmdc-user-auth 用户认证与权限模块（v2.0），覆盖：
  JWT认证（HS256、4h有效期、claims注入）、RSA-OAEP加密登录（2048密钥、30天轮换）、
  密码安全（bcrypt存储、3个月过期、首次登录强制改密 must_change_password）、
  账户有效期（account_expires_at、非SuperAdmin必须设置有效期）、
  RBAC权限模型（superadmin/admin/normal/third四级角色、谁注册谁管理原则、registered_by_id）、
  统一权限架构（PermissionModule枚举、jenkins_acls层级权限、project_acls模块级权限、user_permission_caches L2缓存）、
  用户生命周期（disabled→active→locked状态机、工单审批激活）、
  用户注册/管理工单集成（接口注入机制、UserStatusUpdater/WorkflowCreator回调、工单由用户接口内部自动创建）。
  触发场景：修改auth handlers、permission services、user CRUD、workflow callbacks、password policies、JWT/RSA实现。
  Keywords: JWT / RSA-OAEP / bcrypt / RBAC / PermissionModule / jenkins_acls / project_acls / account_expires_at / must_change_password / workflow integration.

allowed-tools:
  - Read
  - Glob
  - Grep
  - Bash
  - Edit
  - Write

argument-hint: "$ARGUMENTS: <变更类型> [目标文件] — 变更类型: auth|permission|user-crud|workflow|password-policy|jwt|rsa|account-validity"

---

# developing-user-auth（用户认证模块）

## 概述
本 Skill 指导 `rmdc-user-auth` 模块的开发，覆盖认证、权限、用户生命周期、工单集成等核心功能。基于 DDS v2.0 设计规范。

## 动态上下文注入

### 查看模块结构
!`find . -type f -name "*.go" -path "*user-auth*" | head -30`

### 查找权限相关代码
!`grep -rn "PermissionModule\|CheckPermission\|jenkins_acls\|project_acls" --include="*.go" | head -20`

### 查看用户表结构
!`grep -A 60 "type User struct" internal/models/*.go`

### 查看工单回调接口
!`grep -rn "UserStatusUpdater\|WorkflowCreator\|ActivateUser" --include="*.go" | head -15`

---

## Plan（规划阶段）

### 产物清单
根据 `$ARGUMENTS` 确定变更范围：

| 变更类型 | 涉及文件 | 下游影响 |
|:---|:---|:---|
| auth | `auth_handler.go`, `auth_service.go` | 前端登录流程、JWT claims、密码过期检查 |
| permission | `permission_handler.go`, `*_permission_service.go`, `*_acl_dao.go` | Jenkins DAC、Project权限、其他模块权限检查 |
| user-crud | `user_handler.go`, `user_service.go`, `user_dao.go` | 工单模块回调、审计日志、账户有效期 |
| workflow | `user_workflow_handler.go`, `*_workflow_service.go` | rmdc-work-procedure 回调 |
| password-policy | `auth_service.go`, `rsa_service.go` | password_expires_at、must_change_password |
| jwt | `auth_middleware.go`, `jwt_utils.go` | 所有需鉴权接口、account_expires_at 检查 |
| rsa | `rsa_service.go`, `rsa_keypair_dao.go` | 前端公钥获取、密钥轮换 |
| account-validity | `user_model.go`, `auth_service.go` | 登录检查、有效期设置规则 |

### 决策点
- [ ] 是否涉及 JWT claims 字段变更？→ See: [reference/03-authentication/jwt-claims.md](reference/03-authentication/jwt-claims.md)
- [ ] 是否涉及 RBAC 角色定义变更？→ See: [reference/05-rbac/rbac-roles.md](reference/05-rbac/rbac-roles.md)
- [ ] 是否涉及用户表 schema 变更？→ See: [reference/09-data-model/user-table-schema.md](reference/09-data-model/user-table-schema.md)
- [ ] 是否涉及工单回调逻辑变更？→ See: [reference/06-registration-workflow/](reference/06-registration-workflow/) + [reference/07-management-workflow/](reference/07-management-workflow/)
- [ ] 是否涉及权限模块枚举 PermissionModule 变更？→ See: [reference/08-permission-model/permission-architecture.md](reference/08-permission-model/permission-architecture.md)
- [ ] 是否涉及 jenkins_acls/project_acls 表结构变更？→ See: [reference/09-data-model/permission-tables-schema.md](reference/09-data-model/permission-tables-schema.md)

---

## Verify（验证清单）

### RBAC 兼容性检查
- [ ] 角色层级未被破坏：superadmin > admin > normal > third（验证 `reference/05-rbac/rbac-roles.md` 角色层级）
- [ ] "谁注册谁管理"原则未被违反：grep `registered_by_id` 校验逻辑
- [ ] SuperAdmin 始终具有全部权限：所有 CheckPermission 首先判断 superadmin
- [ ] Admin 不可创建/升级 SuperAdmin
- [ ] 注册权限矩阵正确：SuperAdmin→所有角色，Admin→normal/third，Normal→third

### JWT/Session 安全检查
- [ ] JWT 签名算法仍为 HS256（对照 `reference/03-authentication/jwt-claims.md`）
- [ ] Token 有效期未超过 4h
- [ ] Claims 包含必要字段：user_id, username, role, status
- [ ] 仅 status=active 用户可通过校验
- [ ] 账户有效期 account_expires_at 过期检查已实现

### 密码与账户有效期检查
- [ ] 密码传输使用 RSA-OAEP(SHA-256, 2048) 加密（参考 `reference/03-authentication/login-design.md`）
- [ ] 密码存储使用 bcrypt
- [ ] 密码有效期为 3 个月（password_expires_at）
- [ ] 首次登录/密码重置后 must_change_password = true
- [ ] 非 SuperAdmin 创建用户必须设置 account_expires_at
- [ ] 登录时检查账户有效期并返回 account_expire_days 提醒

### 权限模块检查
- [ ] PermissionModule 枚举定义完整且一致（对照 `reference/08-permission-model/permission-architecture.md`）
- [ ] jenkins_acls 层级继承正确（Org→Repo→Branch）（参考 `reference/08-permission-model/jenkins-acls.md`）
- [ ] project_acls 模块代码与 JSONB 映射正确（参考 `reference/08-permission-model/project-acls.md`）
- [ ] user_permission_caches L2 缓存失效逻辑正确
- [ ] L1 内存缓存与 L2 DB 缓存同步清除

### API 契约检查
- [ ] 请求/响应字段向后兼容（对照 `reference/10-api-design/api-endpoints.md`）
- [ ] 错误码未被移除或语义变更
- [ ] 新增字段有默认值（must_change_password, account_expires_at）

### 工单集成检查
- [ ] 注册工单：用户初始状态为 disabled（参考 `reference/06-registration-workflow/registration-workflow.md`）
- [ ] 审批通过回调：ActivateUser 状态变更为 active
- [ ] 撤销回调：DeletePendingUser 删除 status=disabled 的用户
- [ ] 管理工单：ExecuteUserManagement 正确执行 update/enable/disable/delete/reset_password/extend_validity（参考 `reference/07-management-workflow/management-workflow.md`）
- [ ] 工单由用户管理接口内部自动创建（前端不直接调用创建工单接口）

### 验证命令
```bash
# 运行单元测试
go test ./internal/user-auth/... -v

# 检查 RBAC 定义一致性
grep -rn "superadmin\|admin\|normal\|third" --include="*.go" | sort | uniq

# 检查 PermissionModule 使用
grep -rn "PermissionModule\|ModuleJenkins\|ModuleProject" --include="*.go"

# 验证 JWT middleware 与账户有效期检查
grep -rn "account_expires_at\|AccountExpiresAt" --include="*.go"

# 验证工单回调注入
grep -rn "UserStatusUpdater\|WorkflowCreator\|SetUserStatusUpdater" --include="*.go"
```

---

## Execute（执行步骤）

### 1. 认证相关变更 (auth)
```bash
# 1. 定位认证处理器
grep -rn "func.*Login\|func.*Register" --include="*.go"

# 2. 修改认证逻辑（注意 must_change_password 和 account_expires_at 检查）
# 3. 更新登录响应（含 password_expire_days, account_expire_days, must_change_password）
# 4. 验证 RSA 加密流程
go test ./internal/user-auth/service/auth_service_test.go -v
```

### 2. 权限相关变更 (permission)
```bash
# 1. 定位权限检查逻辑
grep -rn "CheckPermission\|CheckHierarchical\|PermissionModule" --include="*.go"

# 2. 修改权限逻辑（注意 jenkins_acls 层级继承、project_acls 模块级）
# 3. 更新权限缓存逻辑（L1 内存 + L2 DB user_permission_caches）
# 4. 验证 Jenkins 权限层级
go test ./internal/user-auth/service/jenkins_permission_service_test.go -v
```

### 3. 用户 CRUD 变更 (user-crud)
```bash
# 1. 修改用户服务（注意 registered_by_id/registered_by_name 设置）
# 2. 设置 account_expires_at（非 SuperAdmin 创建时必须）
# 3. 设置 must_change_password = true（新用户/密码重置）
# 4. 同步更新工单回调 executor
# 5. 更新审计日志记录
go test ./internal/user-auth/service/user_service_test.go -v
```

### 4. 工单集成变更 (workflow)
```bash
# 1. 确认接口注入机制（rmdc-core 初始化时注入）
# 2. 实现 UserStatusUpdater 接口（ActivateUser/DeletePendingUser/ExecuteUserManagement）
# 3. 实现 WorkflowCreator 调用（CreateRegistrationWorkflow/CreateManagementWorkflow）
# 4. 验证工单载荷结构（RegistrationWorkflowPayload/ManagementWorkflowPayload）
# 5. 确保前端不直接调用创建工单接口
```

### 5. 账户有效期变更 (account-validity)
```bash
# 1. 添加/修改 users 表的 account_expires_at 字段
# 2. 修改登录检查逻辑（过期拒绝、7天内提醒）
# 3. 修改用户创建逻辑（根据创建者角色设置有效期选项）
# 4. 实现 extend_validity 管理操作
```

---

## Pitfalls（常见坑）

1. **JWT Claims 变更未同步下游**：修改 claims 字段后，必须通知所有依赖模块更新解析逻辑。参考 `reference/03-authentication/jwt-claims.md` 中的兼容性要求。

2. **RBAC 层级破坏**：admin 能创建 superadmin 是严重安全漏洞。每次角色相关变更必须验证 `reference/05-rbac/rbac-roles.md` 中的层级约束。

3. **密码过期时间未刷新**：修改密码、重置密码、创建用户时必须刷新 `password_expires_at` 并设置 `must_change_password`。参考 `reference/04-user-lifecycle/user-lifecycle.md`。

4. **工单回调状态不一致**：用户注册工单撤销时，必须确认用户仍为 disabled 状态才能删除。参考 `reference/06-registration-workflow/registration-workflow.md` 中的状态映射表。

5. **RSA 密钥轮换影响**：密钥过期后自动生成新密钥，前端缓存的旧公钥将无法加密。参考 `reference/03-authentication/login-design.md` 中的轮换策略。

6. **权限缓存脏读**：修改权限后必须同时清除对应用户的 L1 内存缓存和 L2 DB 缓存。参考 `reference/08-permission-model/jenkins-acls.md` 中的缓存失效逻辑。

7. **账户有效期校验遗漏**：登录流程和 JWT 中间件都需要检查 `account_expires_at`。参考 `reference/04-user-lifecycle/user-lifecycle.md` 中的有效期检查逻辑。

8. **工单接口直接调用**：前端不应直接调用创建工单接口。参考 `reference/10-api-design/api-endpoints.md` 中的重要约束。

---

## Reference 目录结构

```
reference/
├── 01-overview/
│   └── module-overview.md       # 模块概述
├── 02-architecture/
│   ├── module-dependencies.md   # 模块依赖关系
│   ├── interface-injection.md   # 接口注入机制
│   └── tech-stack.md            # 技术栈
├── 03-authentication/
│   ├── login-design.md          # 登录设计
│   └── jwt-claims.md            # JWT Claims 定义
├── 04-user-lifecycle/
│   └── user-lifecycle.md        # 用户生命周期
├── 05-rbac/
│   └── rbac-roles.md            # RBAC 角色矩阵
├── 06-registration-workflow/
│   └── registration-workflow.md # 注册工单流程
├── 07-management-workflow/
│   └── management-workflow.md   # 管理工单流程
├── 08-permission-model/
│   ├── permission-architecture.md  # 统一权限架构
│   ├── jenkins-acls.md             # Jenkins 层级权限
│   ├── project-acls.md             # 项目模块权限
│   └── business-info-registry.md   # 业务信息注册中心
├── 09-data-model/
│   ├── user-table-schema.md        # 用户表 Schema
│   └── permission-tables-schema.md # 权限表 Schema
├── 10-api-design/
│   └── api-endpoints.md         # API 接口清单
└── 11-security/
    └── security-compliance.md   # 安全与合规
```

---

## 相关文件速查

| 用途 | 路径 |
|:---|:---|
| 模块概述 | [reference/01-overview/module-overview.md](reference/01-overview/module-overview.md) |
| 模块依赖 | [reference/02-architecture/module-dependencies.md](reference/02-architecture/module-dependencies.md) |
| 接口注入 | [reference/02-architecture/interface-injection.md](reference/02-architecture/interface-injection.md) |
| 登录设计 | [reference/03-authentication/login-design.md](reference/03-authentication/login-design.md) |
| JWT Claims | [reference/03-authentication/jwt-claims.md](reference/03-authentication/jwt-claims.md) |
| 用户生命周期 | [reference/04-user-lifecycle/user-lifecycle.md](reference/04-user-lifecycle/user-lifecycle.md) |
| RBAC 角色 | [reference/05-rbac/rbac-roles.md](reference/05-rbac/rbac-roles.md) |
| 注册工单 | [reference/06-registration-workflow/registration-workflow.md](reference/06-registration-workflow/registration-workflow.md) |
| 管理工单 | [reference/07-management-workflow/management-workflow.md](reference/07-management-workflow/management-workflow.md) |
| 权限架构 | [reference/08-permission-model/permission-architecture.md](reference/08-permission-model/permission-architecture.md) |
| Jenkins 权限 | [reference/08-permission-model/jenkins-acls.md](reference/08-permission-model/jenkins-acls.md) |
| 项目权限 | [reference/08-permission-model/project-acls.md](reference/08-permission-model/project-acls.md) |
| 用户表 Schema | [reference/09-data-model/user-table-schema.md](reference/09-data-model/user-table-schema.md) |
| 权限表 Schema | [reference/09-data-model/permission-tables-schema.md](reference/09-data-model/permission-tables-schema.md) |
| API 端点 | [reference/10-api-design/api-endpoints.md](reference/10-api-design/api-endpoints.md) |
| 安全合规 | [reference/11-security/security-compliance.md](reference/11-security/security-compliance.md) |
| 认证处理器骨架 | [examples/auth-handler-skeleton.go](examples/auth-handler-skeleton.go) |
| 权限检查骨架 | [examples/permission-check-skeleton.go](examples/permission-check-skeleton.go) |
| 工单回调示例 | [examples/workflow-callback-skeleton.go](examples/workflow-callback-skeleton.go) |
| 验证脚本 | [scripts/verify-user-auth.sh](scripts/verify-user-auth.sh) |
