Files
junhong_cmp_fiber/openspec/specs/data-permission/spec.md
huang 03a0960c4d
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m2s
refactor: 数据权限过滤从 GORM Callback 改为 Store 层显式调用
- 移除 RegisterDataPermissionCallback 和 SkipDataPermission 机制
- 在 Auth 中间件预计算 SubordinateShopIDs 并注入 Context
- 新增 ApplyShopFilter/ApplyEnterpriseFilter/ApplyOwnerShopFilter 等 Helper 函数
- 所有 Store 层查询方法显式调用数据权限过滤函数
- 权限检查函数 CanManageShop/CanManageEnterprise 改为从 Context 获取数据

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-26 16:38:52 +08:00

61 lines
2.1 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
数据权限过滤机制,通过业务层显式调用实现数据隔离。
## Requirements
### Requirement: Subordinate IDs Caching
系统 SHALL 缓存用户的下级店铺 ID 列表以提高查询性能。
#### Scenario: 缓存命中
- **WHEN** 获取用户下级店铺 ID 列表
- **AND** Redis 缓存存在
- **THEN** 直接返回缓存数据
#### Scenario: 缓存未命中
- **WHEN** 获取用户下级店铺 ID 列表
- **AND** Redis 缓存不存在
- **THEN** 执行递归查询获取下级店铺 ID
- **AND** 将结果缓存到 Redis30 分钟过期)
#### Scenario: 请求级别复用
- **WHEN** 同一请求内多次需要下级店铺 ID 列表
- **THEN** 从 Context 中获取预计算的值
- **AND** 不重复查询 Redis 或数据库
### Requirement: Store 层显式数据权限过滤
系统 SHALL 在 Store 层查询方法中显式调用数据权限过滤函数。
#### Scenario: 有 shop_id 字段的表
- **WHEN** Store 执行列表查询
- **AND** 表包含 `shop_id` 字段
- **THEN** 显式调用 `ApplyShopFilter(ctx, query)`
- **AND** 代理用户只能查询 `shop_id IN (subordinateShopIDs)` 的数据
#### Scenario: 有 enterprise_id 字段的表
- **WHEN** Store 执行列表查询
- **AND** 表包含 `enterprise_id` 字段
- **AND** 当前用户为企业用户
- **THEN** 显式调用 `ApplyEnterpriseFilter(ctx, query)`
- **AND** 企业用户只能查询 `enterprise_id = ?` 的数据
#### Scenario: 有 owner_shop_id 字段的表
- **WHEN** Store 执行列表查询
- **AND** 表包含 `owner_shop_id` 字段(如 Enterprise 表)
- **THEN** 显式调用 `ApplyOwnerShopFilter(ctx, query)`
- **AND** 代理用户只能查询 `owner_shop_id IN (subordinateShopIDs)` 的数据
#### Scenario: NULL shop_id 不可见
- **WHEN** 代理用户查询有 `shop_id` 字段的表
- **AND** 记录的 `shop_id` 为 NULL平台库存
- **THEN** 该记录对代理用户不可见
#### Scenario: 平台用户/超管不过滤
- **WHEN** 平台用户或超级管理员执行查询
- **THEN** Helper 函数不添加任何过滤条件
- **AND** 可查询所有数据