对象与属性的安全策略
objectSecurityPolicy 管行,propertySecurityGroups 管列;必填 Marking 属性与 markingConstraint;读取时判定。

本课目标
读完这一课,你将能够
- 分清对象安全策略(行)、属性安全策略(列)和单元格级,说出策略由什么组成
- 说出策略的限制:只在读取时生效、主键不入属性策略、一个属性至多一个策略、对象策略最多 10 个比较、权重合计小于 10,000
- 用必填 Marking 属性、markingConstraint 和行策略设计访问控制
行、列与单元格
Markings 是整份资源的一道门,这一节讲更细的:同一个 Object Type 里,哪些行、哪些列给谁。对象安全策略决定一行(一个对象)你看不看得到;属性安全策略在它之上,再盖住某几个属性。两者叠起来就是单元格级:先过行,再过列。
| 对象安全策略(行级) | 属性安全策略(列级) | |
|---|---|---|
| 管什么 | 一个对象看不看得到 | 某几个属性值看不看得到 |
| 没通过时 | 整个对象不出现 | 那个属性读到空值(null) |
| 范围 | 缺省管全部属性 | 只管被选中的属性 |
| 例子 | 采购员只看自己负责国家的 supplier | customer.creditLimitUsd 只给财务 |
读一个属性值要连过三关:在对象类型上是 Viewer;通过你配置的细粒度策略;通过 Markings 与组织的检查。三关都是「与」。
一条策略里有什么
策略的核心是一条细粒度规则:把用户的属性、对象的属性和一个具体的值放在一起比较,再用「与」「或」组合。例如「用户的负责国家等于供应商的 country」。
让采购员读到全部供应商,再靠界面把不该看的行藏起来。
在读取层规定:采购员只读得到 country 等于自己负责国家的 supplier 行,界面只是照实显示。
- 建对象安全策略
在
customer上限定谁看得到哪些客户行。 - 决定继承什么
策略缺省继承数据源上的 Markings 与组织;不需要的去掉,需要的加上。
- 建属性安全策略
选中
creditLimitUsd,给策略起个名字,要求持有finance。 - 用真人测试
指定一个用户和一个对象,看他能读到哪些属性,再保存。
记住这些限制:属性策略需要对象策略;主键不能进属性策略;非主键属性至多属于一个属性策略。对象策略最多 10 个比较。权重不是比较数:常量 1,集合 1,000,Marking 条件 3,000。对象与属性策略的权重合计要小于 10,000。改策略的人要是 Owner,还要满足改前、改后的相关 Markings。添加要 USE;去掉或停止继承要 DECLASSIFY 和 USE。
强制控制属性与受限视图
按每行自己的 Markings 判定访问,用必填的 marking 或 array<marking> 属性。AIDC 当前只支持 Marking,不支持 Organization 或 CBAC 控制属性。用 dataSecurity.markingConstraint.markingIds 限定可写值,再在行策略的 markingProperty 条件中引用属性。只存值不设条件,不会过滤行。
- 必须必填,不能为 null;空列表表示人人都满足,等于不设限。
- 建它时要声明允许的 Markings 范围;写入超出范围的值会被拒绝,Action 提交也会失败。
- 缺省隐藏:它是别的字段的「门」,通常不必出现在对象视图里。
受限视图是更早的做法:在数据源一侧,按用户属性过滤数据集的行,再让 Object Type 接在视图上。它只能建在数据集上,改了策略要重建。官方现在推荐对象与属性安全策略:策略更新几乎立即生效,也能用于流式数据。数据集在本体(Ontology)之外也要按行控制时,受限视图仍然有用。
在 AIDC 里:配置与测试行列策略
这些策略只在读取时生效。AI 分析步骤拿到的数据进入模型上下文后,输出不自动继承源控制。检查工作流的拥有者权限、输出内容和目标资源,不能只靠提示词。
要保护 creditLimitUsd,可以直接在客户类型的 propertySecurityGroups 中引用财务 Marking。无需强制拆类型。Object Type 仍继承父资源权限,自己的授予不能减去继承权限。
用 aidc semantic security test customer --user <账号 id> --pk C-1001 测试行列访问。结果只报告能否看见,不返回属性值。
如果业务需要独立的信用档案,可以另建 CustomerCredit,再用一对一 Link Type 连回 customer。这是可选建模方案。拆开以后仍要配置财务 Marking 或安全策略,不能假设少授予就收紧了继承权限:
{
"kind": "objectType",
"apiName": "CustomerCredit",
"title": "客户信用",
"description": "客户的信用额度,只给财务读。",
"schema": {
"titleColumn": "customerId",
"columns": [
{ "name": "customerId", "type": "string", "primaryKey": true, "title": "客户 ID" },
{ "name": "creditLimitUsd", "type": "decimal", "title": "信用额度(美元)", "notNull": true }
]
}
}
{
"kind": "linkType",
"apiName": "CustomerCreditProfile",
"title": "客户的信用档案",
"schema": {
"from": "customer", "to": "CustomerCredit", "cardinality": "ONE_TO_ONE",
"apiNameAtoB": "credit", "apiNameBtoA": "customer",
"foreignKey": { "side": "to", "property": "customerId" }
}
}
下一节讲另一半:改了、批了、导出了,怎样留下账。
要点
- 对象安全策略管行,属性安全策略管列;没过行,整个对象不出现,没过列,属性读到空值。
- 属性策略需要对象策略;主键不入属性策略;一个属性至多一个策略。对象策略最多 10 个比较,行列策略权重合计小于 10,000。
- 强制控制属性让每一行带着自己的 Markings;受限视图是更早的做法,新设计优先用安全策略。
- AIDC 已有行列策略、必填 Marking 属性与 markingConstraint。策略只在读取时生效,输出不会自动继承。
练一练
把一条保护要求拆成策略
拿示例工厂的两个要求,先写成策略,再写成 AIDC 今天做得到的样子。
用一句话写出「采购员只看自己负责国家的供应商」:左边是用户的什么属性,右边是 supplier 的哪个属性,用什么比较。
照 JSON 给 CustomerCredit 加 date 属性 creditReviewedOn,再写出财务 Marking 或列策略的配置。说明为什么只授予财务 Viewer 不能取消父资源的继承授予。
列出三条会把 creditLimitUsd 搬走的路径(例如 Action、工作流的 AI 分析步骤、导出),说明哪一条最难被发现。
小测
选一个答案,马上看解析。
Q1一个用户通过了对象安全策略,但没通过 creditLimitUsd 所在的属性安全策略。他读到什么?
过了行、没过列,那一格读到的是空值。整个对象读不到,是没过对象安全策略的结果。
Q2下面哪一条是属性安全策略的限制?
主键不能进属性策略;非主键属性至多属于一个;而且必须先有对象安全策略。
Q3AIDC 今天要在同一个 customer 类型内,让采购员能读客户却读不到 creditLimitUsd,靠什么?
已有属性安全策略。把 creditLimitUsd 放进 propertySecurityGroups,未通过条件的人读到 null。无需拆类型,界面隐藏也不能替代读取层保护。