You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
4 weeks ago | |
|---|---|---|
| .. | ||
| README.md | 4 weeks ago | |
| index.html | 4 weeks ago | |
| permission-logic.js | 4 weeks ago | |
| sample-leads.js | 4 weeks ago | |
README.md
线索权限沙盘(throwaway 原型)
这是可丢弃的原型代码,不是生产代码。 验证完把结论折回 spec,壳丢到废弃分支;permission-logic.js 的判定规则将来指导 crm-lead 的 Java 实现(DataScopeInterceptor 的 OR EXISTS + 状态机操作矩阵)。
问题
三机制权限模型(RBAC + ABAC + ReBAC,见 权限与数据可见性-PRD.md)在纸上自洽,但「角色 × 菜单」的组合爆炸里容易藏矛盾。本原型让你切角色、切菜单,直接看:
- 可见数据集怎么随 ABAC 部门天花板 / ReBAC 池通行证 变——尤其公海池负责人/协作人越部门天花板看池内线索这条越权线。
- 按钮可点性怎么随 RBAC 功能权限 × 状态机矩阵 × owner/管理身份 变。
底部黑色「为什么」面板会把每条线索的判定过程显式打印出来(命中/未命中哪个机制),这是原型要暴露的核心。
角色
- 普通销售(SELF)· 部门主管(DEPT_AND_CHILD)· 公海池负责人(DEPT + ReBAC 池1)· 公海池协作人(DEPT + ReBAC 池1,只读)· 管理员(ALL)
已对齐后台真实权限模型(2026-08-13)
原型的角色/权限结构不再是自编假设,而是对齐 crm-auth 真实表(仍用内存假数据,不连库):
| 机制 | 后台真实模型 | 原型建模 |
|---|---|---|
| RBAC 功能权限 | sys_menu 按钮行:perms码(如 crm:lead:claim)+ denyBehavior(hide/disable)+ status(enabled/disabled 全局断路) |
BUTTONS 字典 + 角色 perms 数组 |
| ABAC 数据范围 | sys_role_data_scope:角色×模块档位,多角色取最宽,无行=SELF(fail safe) |
scopeByModule + scopeOf() |
| ABAC 档位枚举 | DataScopeEnum 1=SELF 2=DEPT 3=DEPT_AND_CHILD 4=ALL |
SCOPE 常量(注意是 DEPT_AND_CHILD 不是 |
| CHILDREN) | ||
| ReBAC 行级授权 | sys_row_grant(ticket 09 待建)resource_type=pool |
poolGrants |
无权限时按 denyBehavior 处理:hide 隐藏(行尾标 👁 N隐藏)、disable 灰化;有权限但状态不满足一律灰化。status=disabled 的按钮即使角色被授权也全局断路。
逻辑与壳的边界
permission-logic.js— 纯判定模块(canSee/buttonsFor),无 DOM。将来迁移进 Java 的就是这层。sample-leads.js— 样本线索,覆盖不同 池/部门/状态/归属。index.html— 丢弃的单页壳,零依赖。
跑
双击 index.html 直接用浏览器打开即可(已内联 js,file:// 不会报 CORS,零依赖、无需服务器)。
旁边的
permission-logic.js/sample-leads.js是逆向供 Java 迁移参考的源(纯逻辑内核);index.html 已把它们内联,两边内容一致。若改了 js,重新内联:node -e "const fs=require('fs');let h=fs.readFileSync('index.html','utf8');/* 重新拼接 */"(或直接改 index.html 内联的那两段)