All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m17s
- 合并 customer_account 和 shop_account 路由到统一的 account 接口 - 新增统一认证接口 (auth handler) - 实现越权防护中间件和权限检查工具函数 - 新增操作审计日志模型和服务 - 更新数据库迁移 (版本 39: account_operation_log 表) - 补充集成测试覆盖权限检查和审计日志场景
106 lines
4.4 KiB
Markdown
106 lines
4.4 KiB
Markdown
# 账号操作审计日志规格
|
||
|
||
## ADDED Requirements
|
||
|
||
### Requirement: 记录所有账号管理操作
|
||
系统 SHALL 记录所有账号管理操作,包括创建、更新、删除、角色分配和移除。
|
||
|
||
#### Scenario: 创建账号时记录审计日志
|
||
- **WHEN** 用户创建账号成功
|
||
- **THEN** 系统应异步写入审计日志,包含操作人、目标账号、操作类型(create)、变更数据(after_data)
|
||
|
||
#### Scenario: 更新账号时记录变更前后数据
|
||
- **WHEN** 用户更新账号信息(用户名、手机号、状态等)
|
||
- **THEN** 系统应记录 before_data 和 after_data,包含所有变更字段
|
||
|
||
#### Scenario: 删除账号时记录审计日志
|
||
- **WHEN** 用户软删除账号
|
||
- **THEN** 系统应记录删除操作,包含被删除账号的完整信息(before_data)
|
||
|
||
#### Scenario: 分配角色时记录审计日志
|
||
- **WHEN** 用户为账号分配角色
|
||
- **THEN** 系统应记录 operation_type=assign_roles,after_data 包含分配的角色 ID 列表
|
||
|
||
#### Scenario: 移除角色时记录审计日志
|
||
- **WHEN** 用户移除账号的角色
|
||
- **THEN** 系统应记录 operation_type=remove_role,包含被移除的角色 ID
|
||
|
||
### Requirement: 审计日志包含完整的操作上下文
|
||
系统 SHALL 在审计日志中记录操作人、目标对象、变更内容和请求上下文。
|
||
|
||
#### Scenario: 记录操作人信息
|
||
- **WHEN** 记录审计日志
|
||
- **THEN** 日志应包含 operator_id、operator_type、operator_name
|
||
|
||
#### Scenario: 记录目标账号信息
|
||
- **WHEN** 记录审计日志
|
||
- **THEN** 日志应包含 target_account_id、target_username、target_user_type
|
||
|
||
#### Scenario: 记录变更数据(JSON格式)
|
||
- **WHEN** 记录更新操作
|
||
- **THEN** before_data 和 after_data 应为 JSONB 格式,包含完整的字段信息
|
||
|
||
#### Scenario: 记录请求上下文
|
||
- **WHEN** 记录审计日志
|
||
- **THEN** 日志应包含 request_id、ip_address、user_agent,可关联访问日志
|
||
|
||
### Requirement: 异步写入不阻塞业务流程
|
||
系统 SHALL 使用 Goroutine 异步写入审计日志,确保业务操作不受审计日志性能影响。
|
||
|
||
#### Scenario: 异步写入审计日志
|
||
- **WHEN** AccountService.Create 创建账号成功
|
||
- **THEN** 主流程立即返回,审计日志在独立 Goroutine 中异步写入
|
||
|
||
#### Scenario: 写入失败只记录错误日志
|
||
- **WHEN** 审计日志写入数据库失败
|
||
- **THEN** 记录 Error 级别日志,包含完整审计信息,但不影响业务操作结果
|
||
|
||
#### Scenario: 业务响应时间不受影响
|
||
- **WHEN** 执行账号创建操作
|
||
- **THEN** API 响应时间不应因审计日志写入而增加(< 1ms)
|
||
|
||
### Requirement: 操作描述使用中文
|
||
系统 SHALL 使用中文描述审计日志的操作类型和内容。
|
||
|
||
#### Scenario: 创建操作描述
|
||
- **WHEN** 记录创建账号操作
|
||
- **THEN** operation_desc 应为 "创建账号: {username}"
|
||
|
||
#### Scenario: 更新操作描述
|
||
- **WHEN** 记录更新账号操作
|
||
- **THEN** operation_desc 应为 "更新账号: {username}"
|
||
|
||
#### Scenario: 删除操作描述
|
||
- **WHEN** 记录删除账号操作
|
||
- **THEN** operation_desc 应为 "删除账号: {username}"
|
||
|
||
#### Scenario: 分配角色操作描述
|
||
- **WHEN** 记录分配角色操作
|
||
- **THEN** operation_desc 应为 "为账号 {username} 分配角色"
|
||
|
||
### Requirement: 支持按多维度查询审计日志
|
||
系统 SHALL 提供索引支持按操作人、目标账号、时间快速查询审计日志。
|
||
|
||
#### Scenario: 按操作人查询日志
|
||
- **WHEN** 查询特定操作人的所有操作记录
|
||
- **THEN** 使用 idx_account_log_operator 索引,查询时间 < 50ms
|
||
|
||
#### Scenario: 按目标账号查询日志
|
||
- **WHEN** 查询特定账号的所有操作记录
|
||
- **THEN** 使用 idx_account_log_target 索引,查询时间 < 50ms
|
||
|
||
#### Scenario: 按时间范围查询日志
|
||
- **WHEN** 查询最近7天的操作记录
|
||
- **THEN** 使用 idx_account_log_created 索引,支持倒序分页
|
||
|
||
### Requirement: 关联访问日志追溯完整请求链路
|
||
系统 SHALL 通过 request_id 关联审计日志和访问日志,支持完整链路追溯。
|
||
|
||
#### Scenario: 通过request_id关联日志
|
||
- **WHEN** 审计日志中记录 request_id="req-12345"
|
||
- **THEN** 可以在 access.log 中查询到对应的 HTTP 请求日志
|
||
|
||
#### Scenario: 追溯完整请求链路
|
||
- **WHEN** 运维人员调查某个账号创建操作
|
||
- **THEN** 通过 request_id 可以查询到:请求参数、权限检查、数据库操作、响应结果
|