岗位
使用岗位对职能和受众锚点进行建模。
岗位(Positions)
岗位描述用户所承担的职能——"销售经理"、"支持坐席"、"审计员"。 自 ObjectStack 13(权限模型 v2,ADR-0090)起,岗位是唯一的人员分组概念: 旧的角色(Role)和简档(Profile)框架已合并为岗位,并从协议中移除。
岗位刻意保持扁平。岗位没有 parent 字段,也没有岗位层级——
汇报结构和基于子树的可见性由业务单元树承载。
岗位职责
使用岗位来建模:
- 职能("销售经理"、"招聘专员"、"审计员");
- 应用、选项卡和知识库(Book)的受众定向;
- 审批职责(类型为
position的审批人会自动展开为当前岗位持有者); - 向持有相同职能的所有用户分发权限集。
使用业务单元来建模组织架构(部门、区域、上下级结构),使用权限集来授予具体的对象、字段和系统能力。
系统对象
| 对象 | 用途 |
|---|---|
sys_position | 岗位定义(扁平——无层级) |
sys_user_position | 用户的岗位分配 |
sys_position_permission_set | 通过岗位分发的权限集 |
sys_business_unit | 用于层级和子树共享的组织架构树 |
sys_business_unit_member | 用户在业务单元中的成员身份(function_in_business_unit) |
对 RBAC 关联表(sys_user_position、sys_position_permission_set、
sys_user_permission_set、sys_permission_set)的写入需要租户级管理员权限或
委托管理范围——
仅对这些表授予普通 CRUD 权限是不够的。
受众锚点:everyone 与 guest
每个部署都会预置两个系统管理的岗位:
| 锚点 | 持有者 |
|---|---|
everyone | 所有已认证的主体(隐式持有) |
guest | 仅无会话(匿名)HTTP 主体 |
将权限集绑定到 everyone 可为所有已登录用户授予基线权限;绑定到 guest
可向匿名访问者开放内容。绑定是叠加式的,并且平台会拒绝将高权限集
(View All / Modify All、删除/清除/转移、系统权限、通配符)绑定到这些锚点。
配置的基线权限集(fallbackPermissionSet,默认 member_default)通过同一条
everyone 绑定路径生效。注意:自 ObjectStack 14.2 起,成员基线不再包含删除权限——
记录删除必须按对象通过岗位分发的权限集显式授予。
带生效期的分配
岗位与权限集分配支持可选的 valid_from / valid_until 时间窗口
(半开区间,UTC;null 表示无界)。过期的授权会立即失效——适用于临时代班、
外包人员和与认证绑定的访问。每条授权可以记录 reason,委托授权还会记录
delegated_from。
标记为 delegatable: true 的岗位允许其当前持有者在有限时间窗口内将岗位自助
委托给其他用户(必须设置未来的 valid_until,上限 30 天,且必须填写原因)。
分发了管理范围(adminScope)权限集的岗位永远不能被委托。
推荐模式
保持一组精简、稳定、以职能为单位的岗位:
Sales Manager
Sales Representative
Support Manager
Support Agent用业务单元建模组织架构:
Sales
├─ EMEA
└─ AMER
Support然后为岗位附加权限集:
Sales Manager 岗位
-> CRM User
-> Sales Manager Access
-> Report Viewer这样可以保持岗位稳定,同时允许权限独立演进。
应避免
- 为每个用户单独创建一个岗位;
- 在每个岗位中重复定义所有权限;
- 将岗位名称用作业务逻辑判断条件;
- 在岗位上重建层级结构——子树可见性属于业务单元和记录共享;
- 在记录共享能更精确实现需求时,却通过管理岗位授予宽泛的访问权限。
从角色迁移(13 之前)
如果你要升级针对 ObjectStack 12 或更早版本编写的元数据:
| 旧版 | 现行 |
|---|---|
sys_role / sys_user_role / sys_role_permission_set | sys_position / sys_user_position / sys_position_permission_set |
defineRole / RoleSchema(含 parent) | definePosition / PositionSchema(扁平) |
元数据类型 role 或 profile | position |
共享接收者 role / role_and_subordinates | position / unit_and_subordinates |
PermissionSetSchema.isProfile | 已移除——isDefault 用于标记安装时的建议分配范围 |
角色层级必须重新建模为业务单元树。os lint 会通过 security-role-word
规则标记遗留的角色词汇。