3. 接入权限

本章在 CRM 离开 dev 之前就把权限收紧。

预计耗时:25 分钟。

3.1 Permission code

permissions.json 中注册 code。AuraBoot 强制 <module>.<resource>.<action> 命名(参见 权限)。

{
  "permissions": [
    { "code": "crm.lead.manage",        "name:zh-CN": "线索管理", "name:en": "Lead Management", "resourceType": "operation", "module": "crm" },
    { "code": "crm.lead.read",          "name:zh-CN": "查看线索", "name:en": "View Leads",      "resourceType": "data",      "module": "crm" },
    { "code": "crm.account.manage",     "name:zh-CN": "客户管理", "name:en": "Account Management", "resourceType": "operation", "module": "crm" },
    { "code": "crm.account.read",       "name:zh-CN": "查看客户", "name:en": "View Accounts",   "resourceType": "data",      "module": "crm" },
    { "code": "crm.opportunity.manage", "name:zh-CN": "商机管理", "name:en": "Opportunity Management", "resourceType": "operation", "module": "crm" },
    { "code": "crm.opportunity.read",   "name:zh-CN": "查看商机", "name:en": "View Opportunities", "resourceType": "data",      "module": "crm" }
  ]
}

每个 resource 通常拆为 manage(写)与 read(读)两类 action;像“资格认证 (qualify)”“转化 (convert)”这类带状态机的操作走 Command(crm:qualify_leadcrm:convert_lead 等),由 Command 自身的权限绑定控制,不需要单列 permission code。

运行静态检查:

# run locally
node scripts/validate-permission-codes.mjs

3.2 角色

创建三个角色:

角色权限
crm.repcrm.lead.read + crm.lead.manage + crm.opportunity.read
crm.managercrm.lead.manage + crm.opportunity.manage + crm.account.manage
crm.admincrm.*.manage + crm.*.read

System → Users 中绑定角色到用户。

3.3 行级数据权限

销售只应看到自己负责的 lead 与 opportunity。

进入 Studio → Data Permissions → New rule,为角色 + 资源 + 操作配置数据范围(scope)。平台的数据范围是枚举类型:none / self / dept / dept_and_sub / all(DataScopeType),self 表示只能看到自己负责的记录(按模型的 owner 字段比对当前用户):

  • Model:crm_lead_common
  • 角色:crm.rep
  • 数据范围:self(crm_lead_common 的 owner 字段为 crm_lead_assigned_to)

crm_opportunity_common 重复此操作(其 owner 字段为 crm_opp_owner)。Manager 与 admin 配置数据范围 all,即可见全部记录。

企业版 Permission 管理界面

3.4 给 Controller / Command 加注解

Controller / 方法可通过 @RequirePermission("<code>") 声明所需权限,其值是 permission code 字符串,例如 @RequirePermission("crm.lead.manage")(注解定义见 RequirePermission.java,String value())。关键约束:注解里引用的 code 必须已在 permissions.json 注册,否则会被 validate-permission-codes.mjs 标为 unregistered code(红线 #13)。

3.5 验证

  • crm.rep 用户登录 → 列表只展示自己的行(self 数据范围生效)
  • 以仅有 crm.opportunity.read 的用户调用推进阶段命令(如 crm:advance_opp_to_proposal)→ 返回 403(无权限)
  • crm.manager 登录 → 所有行可见,推进阶段命令可执行(已有 crm.opportunity.manage)
  • 运行 node scripts/validate-permission-codes.mjs → 没有 unregistered code 警告

下一步

第 4 章 → 自动化流程