Files
junhong_cmp_fiber/openspec/specs/account-operation-audit/spec.md
huang 80f560df33
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m17s
refactor(account): 统一账号管理API、完善权限检查和操作审计
- 合并 customer_account 和 shop_account 路由到统一的 account 接口
- 新增统一认证接口 (auth handler)
- 实现越权防护中间件和权限检查工具函数
- 新增操作审计日志模型和服务
- 更新数据库迁移 (版本 39: account_operation_log 表)
- 补充集成测试覆盖权限检查和审计日志场景
2026-02-02 17:23:20 +08:00

106 lines
4.4 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.
# 账号操作审计日志规格
## 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_rolesafter_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 可以查询到:请求参数、权限检查、数据库操作、响应结果