AccessPolicy Spec
表达访问控制策略的定义语义。当前实现优先使用结构化字段(subject + rules);subjectType / subjectId / resourceRef / action / effect 为兼容展平字段,结构化字段缺失时才会回退使用。
写入服务会先把结构化字段归一化为展平字段,再按运行时语义键定位并 upsert。
AccessPolicySpecDTO
| 字段 | 类型 | 说明 |
|---|---|---|
name | string | 自然键。策略名称,写入运行态时作为 policyName,并用于通配符策略展开分组与按名称删除 |
subjectType | string | 主体类型,例如 USER / ROLE / GROUP(展平兼容字段;subject 存在时忽略) |
subjectId | string | 主体标识(展平兼容字段;subject 存在时忽略) |
resourceRef | ResourceRefDTO | 资源引用(展平兼容字段;rules 存在时忽略)。kind 归一化为 ObjectType,name 作为资源语义名 |
action | string | 动作,例如 READ / WRITE / MANAGE(展平兼容字段;rules 存在时忽略) |
effect | string | 策略效果,例如 ALLOW / DENY(展平兼容字段;rules 存在时忽略) |
rowFilter | Object | 行级过滤条件,可为对象或数组。rules 存在时取第一条规则的 rowFilter,否则取本字段 |
maskedColumns | Object | 字段脱敏配置,可为对象或数组 |
priority | integer | 优先级。未指定时默认 0 |
subject | AccessPolicySubjectDTO | 推荐。结构化主体;设置时无需再写 subjectType / subjectId |
rules | List<AccessPolicyRuleDTO> | 推荐。结构化规则列表;当前实现仅消费第一条规则 |
子结构消费说明
AccessPolicySubjectDTO
| 字段 | 说明 |
|---|---|
roleCode | 角色编码。设置时主体类型推导为 ROLE,主体标识为该值 |
userCode | 用户编码。设置时主体类型推导为 USER,主体标识为该值 |
groupCode | 用户组编码。设置时主体类型推导为 GROUP,主体标识为该值 |
三者互斥,优先命中第一个非空字段(顺序:
roleCode→userCode→groupCode)。
AccessPolicyRuleDTO
| 字段 | 类型 | 说明 |
|---|---|---|
objectRef | ResourceRefDTO | 资源引用。kind 归一化为 ObjectType;name 为语义名,* 表示匹配全部对象类型 |
action | string | 动作,例如 READ / WRITE / MANAGE |
effect | string | 策略效果,例如 ALLOW / DENY |
rowFilter | Object | 行级过滤条件,可为对象或数组 |
maskedColumns | Object | 字段脱敏配置,可为对象或数组 |
priority | integer | 优先级。未指定时默认 0 |
消费位置
foundry-access-control-biz:AccessControlDefinitionWriteService.upsertAccessPolicy将结构化字段归一化为展平字段后,按语义键定位并创建或更新策略。foundry-access-control-biz:AccessPolicyDomainProjectionAdapter调用accessControlDefinitionApi.upsertAccessPolicy。
关键行为与约束
-
自然键为
name- 运行时
policyName设置为该值。 - 通配符策略展开时,按同一
policyName+ 主体 + 动作/效果/优先级 分组管理。 deleteAccessPolicy(String policyName)按policyName在工作空间内删除策略。
- 运行时
-
结构化 vs 展平字段
- 推荐新定义统一使用
subject+rules。 subject与subjectType/subjectId同时存在时,结构化优先。rules与展平字段同时存在时,仅读取rules[0],展平字段被忽略。
- 推荐新定义统一使用
-
资源类型归一化
resourceRef.kind/objectRef.kind为OBJECT_TYPE(不区分大小写)时,运行时存储为ObjectType。- 为空时默认按
ObjectType处理。
-
ObjectType 通配符展开
- 当
objectRef.kind = ObjectType且objectRef.name = '*'时,触发通配符策略。 - 服务会按当前工作空间内的所有对象类型名称,展开为逐对象策略(每个 ObjectType 一条记录)。
- 展开前会清理同一
policyName下已不存在或多余的对象级记录,保证幂等。
- 当
-
rowFilter必填(ALLOW场景)effect = ALLOW时必须提供rowFilter。- 允许全部行时写:
rowFilter: operator: 'TRUE'
-
语义键与更新范围
- 存在性判断语义键:
subjectType + subjectId + resourceType + action + effect + priority(若解析出具体resourceId,同时参与匹配)。 - 已存在时:
subjectType/subjectId/resourceType/action语义键不可变,仅可更新effect、priority、rowFilter、maskedColumns。 - 不存在时创建新策略。
- 存在性判断语义键:
相关文档
- 核心概念 — ResourceRef 解析规则
- Foundry Definition Spec 总览 — Bundle 与自然键约定