01 Quickstart中文
01 · 快速入门——四步完成首次授权判定
规范来源:
capability-language-core-v1.md§5 (Grant)、§6 (Binding)、§9 (Decision Function) 本页是一份易读指南。如有冲突,以规范原文为准。 状态:Preview——不得用于生产环境。
速览
CLC-v1 回答一个问题:这个请求是否属于我的授权范围? 你编写一份 grant(agent 可以做什么),系统提供一个 request(agent 想做什么),语言则返回 allow、deny 或 allow_unresolved,并始终附上稳定的 reason code。以下内容仅用于讲解:无需安装,也无需运行时。示例都是真实的测试集 vectors,日后可用任意一致性运行器重新执行。
心智模型
grant 和 request 采用相同结构:一个 capability identifier(id),以及可选的 params、param_bounds 和 constraints。decision function 依次检查:标识符是否兼容?params 是否处于 grant 的边界内?grant 的 constraints 是否满足?
grant { id, params?, param_bounds?, constraints? }
request { id, params? } ← an Operation
↓
verdict + reason (allow / deny / allow_unresolved)
第 1 步——最小闭环(完全相同的标识符)
最小案例:request 标识符与 grant 标识符逐字相同。
grant = { "id": "std/database-v1:query:SELECT" }
request = { "id": "std/database-v1:query:SELECT" }
输出:allow(reason:—)。推导过程:literal match(§6.1)。
标识符采用 scheme:path:action 形式。匹配按层级从左到右进行,因此更具体的 request 仍必须落在 grant 范围内。这就引出了通配符。
第 2 步——添加通配符(授权一类操作)
末尾的 * 可匹配一个或多个剩余 segment。
grant = { "id": "std/database-v1:query:*" }
request = { "id": "std/database-v1:query:SELECT" }
输出:allow。该 grant 覆盖 std/database-v1:query: 下的任意单个 action。
通配符容易误用,详见下方误区。路径中较靠前的 * 完全是另一回事:
grant = { "id": "std/database-v1:*" }
request = { "id": "std/database-v1:query:SELECT" }
输出:deny different_namespace。位于 class(product)位置的 *不是末尾 action 通配符(§6.1/§9.1 layer 3)。完整规则见 03-identifiers.md。
第 3 步——添加 params 和边界(收窄 grant)
grant 可以携带 params,用于规定 request 必须遵守的精确值;也可以携带 param_bounds,表达数组形式的 params 无法表达的范围。
params——数值上限——vectors.json → params-001
grant = { "id": "std/database-v1:query:SELECT", "params": { "limit": 100 } }
request = { "id": "std/database-v1:query:SELECT", "params": { "limit": 50 } }
输出:allow(50 ≤ 100)。
param_bounds——包含端点的范围——param-bounds-vectors.json → pb-001 / pb-004
grant = { "id": "std/database-v1:query:SELECT",
"param_bounds": { "limit": { "min": 10, "max": 100 } } }
request = { "id": "std/database-v1:query:SELECT", "params": { "limit": 50 } }
输出:allow。但若改为 "limit": 9(pb-004),同一 grant 会返回 deny params_out_of_range。
数组参数是一个 set(enum)——request 只能选择集合成员。——vectors.json → params-004
grant = { "id": "std/database-v1:query:SELECT", "params": { "tables": ["a"] } }
request = { "id": "std/database-v1:query:SELECT", "params": { "tables": ["a", "b"] } }
输出:deny not_in_enum——"b" 不在允许的集合中。详见 07-parameters.md。
第 4 步——添加 constraints(管理限制)并得到第三种 verdict
Constraints 是 grant 上的 (scheme,type):value 字符串。core 会直接求值 max_rows;它能识别 network/time,但不对它们求值,而是将其作为义务返回。
已求值的 constraint——vectors.json → decide-006
grant = { "id": "std/database-v1:query:SELECT",
"constraints": [ "varwof/constraint-v1:max_rows:10" ] }
request = { "id": "std/database-v1:query:SELECT", "params": { "max_rows": 50 } }
输出:deny max_rows:violated。
可识别但未求值——第三种 verdict——vectors.json → decide-035(两个覆盖请求的 grants,multi)
grant-zero = { "id": "std/database-v1:query:SELECT",
"constraints": [ "varwof/constraint-v1:network:cidr:[\"192.0.2.0/24\"]" ] }
grant-one = { "id": "std/database-v1:query:SELECT",
"constraints": [ "varwof/constraint-v1:time:window:[{\"start\":\"00:00\",\"end\":\"06:00\"}]" ] }
request = { "id": "std/database-v1:query:SELECT" }
输出:allow_unresolved,并包含
"unresolved": [ "varwof/constraint-v1:network:cidr:[\"192.0.2.0/24\"]",
"varwof/constraint-v1:time:window:[{\"start\":\"00:00\",\"end\":\"06:00\"}]" ]
allow_unresolved不是allow:消费方必须自行履行每项义务,否则必须拒绝(§8.4)。见 08-constraints.md 和 10-decisions.md。
你已经构建了什么
| 步骤 | Grant 特性 | 得到的 Verdict | 真实测试集 id |
|---|---|---|---|
| 1 | literal identifier | allow | entail-001 |
| 2 | 末尾 * 通配符 / class 位置的 * |
allow / different_namespace |
entail-002 / entail-007 |
| 3 | params 上限、param_bounds 范围、enum set |
allow / params_out_of_range / not_in_enum |
params-001、pb-001/pb-004、params-004 |
| 4 | 已求值 + 剩余 constraints | max_rows:violated / allow_unresolved |
decide-006 / decide-035 |
常见误区
- 末尾
*匹配一个或多个 segment,而不是零个。std/database-v1:query:*这一 grant 不覆盖裸值std/database-v1:query。该 request 没有可匹配的末尾 segment,因此返回wildcard_requires_trailing_segment(entail-005)。 *只能作为 action 通配符。 放在其他任何位置,都会使标识符变成另一类别,而不是通配符的超集(different_namespace)。params中的数组是枚举,不是范围。 request 只能选择集合成员。若 grant 为["a"],request 为["a","b"],结果就是deny,因为整个 request 集合都必须被覆盖。- 字面量不匹配——grant 为
...:SELECT,request 为...:INSERT——会返回literal_mismatch,即使二者都属于“一种 query action”(entail-006)。 allow_unresolved不是allow。 消费方绝不能把第三种 verdict 并入 allow 决定。
← README.md · → 02-overview.md · 相关:03-identifiers.md、07-parameters.md、08-constraints.md