docs: AGENTS.md 记录业务分组数据权限机制(红线、优先级、过渡开关)
This commit is contained in:
37
AGENTS.md
37
AGENTS.md
@ -55,6 +55,43 @@
|
||||
MOM 里存在 171 条 `IRIS/成品/LICA/...`(无人机/野外便携/高塔监测等),
|
||||
模糊匹配会把 IRIS 的物料漏给 LICA。已实测前缀匹配命中 795 条 / 5 个分组。
|
||||
|
||||
- **业务分组数据权限**(2026-09 新增,是**部门隔离之内**的第二层)
|
||||
LICA 部门内部再分组(生产大组 / 维修大组,各自可建小组),组对应
|
||||
`lifecycle_phase`,成员只看本组阶段的数据。组存在 Track 库(`business_groups`
|
||||
/ `business_group_phases` / `business_group_members`),人在 MOM。
|
||||
|
||||
**唯一判定来源**:`app/services/data_scope_service.py` 的 `DataScope`。
|
||||
- `scope.product_where()` —— 主体是 Product 的语句用
|
||||
- `scope.task_where()` —— 主体是 Task 的语句用,**前置条件:调用方必须已
|
||||
`join(Product, Task.product_id == Product.id)`**(tasks 表没有 lifecycle_phase)
|
||||
- ⚠️ **业务代码里不准再手写 `lifecycle_phase` 过滤**。评审检查:
|
||||
`grep -rn "lifecycle_phase.in_" backend/app/` 应只命中 `data_scope_service.py`
|
||||
- ⚠️ 两条红线:`None`(不限) 与 `frozenset()`(空) 语义相反,不共用哨兵值;
|
||||
空集合必须显式 `false()` —— SQLAlchemy 对 `in_(())` 生成 `IN (NULL)`,
|
||||
一旦退化成不过滤就是全量泄漏
|
||||
|
||||
解析优先级(`resolve_data_scope`):
|
||||
1. `SUPER_ADMIN` → 永远全厂(硬编码,不可被分组覆盖)
|
||||
2. 被显式分进组 → 该组生效(**分组优先于角色**,SUPERVISOR 被分组也会受限)
|
||||
3. 未分组的 `SUPERVISOR` → 默认全厂
|
||||
4. 未分组的普通用户 → 按 `DATA_SCOPE_UNGROUPED`(见下)
|
||||
|
||||
**过渡开关** `config.DATA_SCOPE_UNGROUPED`:
|
||||
- `"ALL"`(当前默认)= 未分组用户先放行,同时打 WARNING 记录「谁还没分组」
|
||||
- `"NONE"` = 目标态:未分组 = 看不到任何数据(列表返回 `[]`,不是 403)
|
||||
- 直接上 NONE 会让所有未分组工人当场看不到自己的任务、现场停摆。
|
||||
推荐节奏:ALL 上线 → 看日志收集名单 → 建组配人 → 改 NONE 重启。
|
||||
|
||||
**其它约定**:
|
||||
- 扫码 `get_product_by_serial` **刻意不过滤**(现场要能判断设备走没走错流程),
|
||||
理由写死在该函数 docstring 里;「不能操作」由 `_check_permission` 保证。
|
||||
- 分组**管理**仅 `SUPER_ADMIN`(`require_roles(SUPER_ADMIN)`,不能用
|
||||
`require_admin`)。原因:被分组的主管若能把人移出组,就等于获得提权路径。
|
||||
- 组支持两级(`parent_id`),子组不配范围则继承父组。
|
||||
- 删组**仅限空组** —— 级联删是静默的批量权限变更。
|
||||
- 统计接口(dashboard/analytics/screen 共 20 个路由)**已从匿名可访问变为需登录**
|
||||
并受范围过滤。注意:大屏挂满 7 天后 refresh token 过期会跳登录页。
|
||||
|
||||
## 本地起环境(关键,踩过的坑都在这)
|
||||
|
||||
1. **本机没有 Postgres 时需要先装**(容器内 `sudo` 可用):
|
||||
|
||||
Reference in New Issue
Block a user