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.
 
 
 
 
 
 
luoweijian b345c4dc7b commit 4 weeks ago
..
README.md commit 4 weeks ago
index.html commit 4 weeks ago
permission-logic.js commit 4 weeks ago
sample-leads.js commit 4 weeks ago

README.md

线索权限沙盘(throwaway 原型)

这是可丢弃的原型代码,不是生产代码。 验证完把结论折回 spec,壳丢到废弃分支;permission-logic.js 的判定规则将来指导 crm-lead 的 Java 实现(DataScopeInterceptor 的 OR EXISTS + 状态机操作矩阵)。

问题

三机制权限模型(RBAC + ABAC + ReBAC,见 权限与数据可见性-PRD.md)在纸上自洽,但「角色 × 菜单」的组合爆炸里容易藏矛盾。本原型让你切角色、切菜单,直接看:

  1. 可见数据集怎么随 ABAC 部门天花板 / ReBAC 池通行证 变——尤其公海池负责人/协作人越部门天花板看池内线索这条越权线。
  2. 按钮可点性怎么随 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 内联的那两段)