编辑
2026-11-03
C计划
00

7.1 「可管理」和 RBAC 的关系

名单只回答范围(能管哪些号),RBAC 回答能力(能不能管)。判定要走两层,缺一不可:

可管理 = 名单命中(本表) AND RBAC 通过(directory:extension:manage)
  • 名单把某个号的管理范围扩到指定部门;

  • 但对方账号还得有 directory:extension:manage 权限码,否则名单里挂了他也没用;

  • 该号没有任何名单行时,管理范围回落到 RBAC 的默认范围:分机号所属成员所在部门的子树管理员。

这样两套体系仍然互不越界:访问控制只管"能看到什么/范围到哪",RBAC 只管"能不能操作"。


九、管理权限:完全复用统一授权

按《统一授权与 Scope 服务设计方案》,通讯录注册自己的 scope_type_code,角色、授权、鉴权全部走 ums_* 六张表。

项

取值

scope_type_code

contact(通讯录)

application_code

directory

Scope 资源

(contact, directory_node.id) —— 一个部门节点就是一个 Scope

角色

ums_role(application_code='directory', scope_mode='SCOPE_RELATED', scope_type_code='contact')

授权

ums_grant_scope(grant_id, scope_type_code='contact', scope_id=节点ID),覆盖该节点及其全部后代

鉴权

AuthorizationService.Check(actor, 'directory:node:update', contact, nodeID)

通讯录插件要提供的 ScopeResolver(注册到 ScopeResolverRegistry):

方法

通讯录实现

Resolve(scopeID)

查 directory_node,返回 ParentID 与 Enabled(deleted_at IS NULL)

ListAncestorIDs(scopeID)

递归 CTE 上溯 parent_id,包含自身与 ROOT

ListDescendantIDs(scopeID)

递归 CTE 下探,包含自身

ListAllIDs()

全部有效节点 ID

权限码(启动时用 PermissionService.RegisterBatch 幂等注册):

directory:node:list        SCOPE_RELATED  contact
directory:node:create      SCOPE_RELATED  contact
directory:node:update      SCOPE_RELATED  contact
directory:node:move        SCOPE_RELATED  contact
directory:node:delete      SCOPE_RELATED  contact
directory:member:list      SCOPE_RELATED  contact
directory:member:create    SCOPE_RELATED  contact
directory:member:update    SCOPE_RELATED  contact
directory:member:delete    SCOPE_RELATED  contact
directory:access:config    SCOPE_RELATED  contact   -- 配置部门通用访问控制(level)
directory:extension:manage SCOPE_RELATED  contact   -- 管理分机号本体(改号/分配/回收)
directory:extension:access:config SCOPE_RELATED contact -- 配置分机号特殊控制(名单增删)

要点:

  • 授权范围 = 部门子树。给张三"通讯录管理员"角色并绑在"研发中心"→ 他只能管研发中心及其下级,管不到测试中心。绑在 ROOT → 管全公司。

  • 角色天生带 scope 类型:SCOPE_RELATED + contact 的角色不可能被绑到站点 Scope 上,统一授权会直接拒绝(AUTH_ROLE_SCOPE_MISMATCH),不需要通讯录自己防。

  • 删除部门前必须调 GrantService.RemoveScopeBindings(contact, nodeID),由授权服务清理该 Scope 的直接绑定(通讯录不允许直接写 ums_grant_scope)。

  • 移动/改名部门后要通知授权服务失效 contact 类型的范围展开缓存,否则子树范围还是旧的。

  • 管理角色不参与可见性判定:管理员查通讯录同样按第八节脱敏,两套体系互不干涉。

本文作者:剑心

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!