Files
junhong_cmp_fiber/openspec/specs/data-permission/spec.md
huang fdcff33058
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m9s
feat: 实现企业卡授权和授权记录管理功能
主要功能:
- 添加企业卡授权/回收接口 (POST /enterprises/:id/allocate-cards, recall-cards)
- 添加授权记录管理接口 (GET/PUT /authorizations)
- 实现代理用户数据权限过滤(只能查看自己店铺下企业的授权记录)
- 添加 GORM callback 支持授权记录表的数据权限过滤

技术改进:
- 原生 SQL 查询手动添加数据权限过滤(ListWithJoin, GetByIDWithJoin)
- 移除卡授权预检接口(allocate-cards/preview),保留内部方法
- 完善单元测试和集成测试覆盖
2026-01-26 15:07:03 +08:00

78 lines
2.6 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.
# data-permission Specification
## Purpose
TBD - created by archiving change refactor-framework-cleanup. Update Purpose after archive.
## Requirements
### Requirement: GORM Callback Data Permission
系统 SHALL 使用 GORM Callback 机制自动为所有查询添加数据权限过滤。
#### Scenario: 自动应用权限过滤
- **WHEN** 执行 GORM 查询
- **AND** Context 包含用户信息
- **AND** 表包含 owner_id 字段
- **THEN** 自动添加 WHERE owner_id IN (subordinateIDs) 条件
#### Scenario: Root 用户跳过过滤
- **WHEN** 当前用户是 Root 用户
- **THEN** 不添加任何数据权限过滤条件
- **AND** 可查询所有数据
#### Scenario: 无 owner_id 字段的表
- **WHEN** 表不包含 owner_id 字段
- **THEN** 不添加数据权限过滤条件
#### Scenario: 授权记录表特殊处理
- **WHEN** 查询 `tb_enterprise_card_authorization`
- **AND** 当前用户是代理用户
- **THEN** 自动添加 WHERE enterprise_id IN (SELECT id FROM tb_enterprise WHERE owner_shop_id = 当前店铺ID) 条件
- **AND** 不包含下级店铺的数据
#### Scenario: 平台用户查询授权记录
- **WHEN** 查询 `tb_enterprise_card_authorization`
- **AND** 当前用户是平台用户或超级管理员
- **THEN** 不添加数据权限过滤条件
- **AND** 可查询所有授权记录
### Requirement: Skip Data Permission
系统 SHALL 支持通过 Context 绕过数据权限过滤。
#### Scenario: 显式跳过权限过滤
- **WHEN** 调用 SkipDataPermission(ctx) 获取新 Context
- **AND** 使用该 Context 执行 GORM 查询
- **THEN** 不添加任何数据权限过滤条件
#### Scenario: 内部操作跳过过滤
- **WHEN** 执行内部同步、批量操作或管理员操作
- **THEN** 应使用 SkipDataPermission 绕过过滤
### Requirement: Subordinate IDs Caching
系统 SHALL 缓存用户的下级 ID 列表以提高查询性能。
#### Scenario: 缓存命中
- **WHEN** 获取用户下级 ID 列表
- **AND** Redis 缓存存在
- **THEN** 直接返回缓存数据
#### Scenario: 缓存未命中
- **WHEN** 获取用户下级 ID 列表
- **AND** Redis 缓存不存在
- **THEN** 执行递归 CTE 查询获取下级 ID
- **AND** 将结果缓存到 Redis30 分钟过期)
### Requirement: Callback Registration
系统 SHALL 在应用启动时注册 GORM 数据权限 Callback。
#### Scenario: 注册 Callback
- **WHEN** 调用 RegisterDataPermissionCallback(db, accountStore)
- **THEN** 注册 Query Before Callback
- **AND** Callback 名称为 "data_permission"
#### Scenario: AccountStore 依赖
- **WHEN** 注册 Callback 时
- **THEN** 需要传入 AccountStore 实例用于获取下级 ID