查看“CBAC”的源代码
←
CBAC
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看和复制此页面的源代码。
<meta property="mw:pageId" content="75" /> <meta property="mw:pageNamespace" content="0" /> <meta property="mw:revisionSHA1" content="256a4cfa7999ae45eb97cc5690cc00c9c38a6705" /> <meta property="dc:modified" content="2026-08-30T23:08:30.000Z" /> <meta property="mw:html:version" content="2.1.0" /> [https://www.smartlegalcontract.cn/mediawiki/index.php/CBAC][/mediawiki/load.php?modules=mediawiki.skinning.content.parsoid%7Cmediawiki.skinning.interface%7Csite.styles%7Cmediawiki.page.gallery.styles%7Cext.cite.style%7Cext.cite.styles%7Cext.pygments%7Cext.pygments&only=styles&skin=vector] <meta http-equiv="content-language" content="zh-cn" /> <meta http-equiv="vary" content="Accept" /> = 概述 <meta property="mw:pageId" content="75" /> <meta property="mw:pageNamespace" content="0" /> <meta property="mw:revisionSHA1" content="256a4cfa7999ae45eb97cc5690cc00c9c38a6705" /> <meta property="dc:modified" content="2026-08-30T23:08:30.000Z" /> <meta property="mw:html:version" content="2.1.0" /> [https://www.smartlegalcontract.cn/mediawiki/index.php/CBAC] = [/mediawiki/load.php?modules=mediawiki.skinning.content.parsoid%7Cmediawiki.skinning.interface%7Csite.styles%7Cmediawiki.page.gallery.styles%7Cext.cite.style%7Cext.cite.styles%7Cext.pygments%7Cext.pygments&only=styles&skin=vector]1、主体 <meta property="mw:pageId" content="75" /> <meta property="mw:pageNamespace" content="0" /> <meta property="mw:revisionSHA1" content="256a4cfa7999ae45eb97cc5690cc00c9c38a6705" /> <meta property="dc:modified" content="2026-08-30T23:08:30.000Z" /> <meta property="mw:html:version" content="2.1.0" /> [https://www.smartlegalcontract.cn/mediawiki/index.php/CBAC]注册时签[/mediawiki/load.php?modules=mediawiki.skinning.content.parsoid%7Cmediawiki.skinning.interface%7Csite.styles%7Cmediawiki.page.gallery.styles%7Cext.cite.style%7Cext.cite.styles%7Cext.pygments%7Cext.pygments&only=styles&skin=vector]主体合约,资源托管时签客体合约;两份合约放入同一个 policySet,按业务场景组合 - policySet 是未签署的组合框架,policy 是一份已签署合约 - CBAC 是主文档,主体合约 + 客体合约,两份都签署 - SPESC 是执行投影。判决投影管 Permit/Deny,执行投影管付费、分账、违约 - 因为 SPESC 本身只有立约和付款,装不下访问控制和角色派生,CBAC 补这一层 2、原始 SPESC 格式不能破坏,只能追加: - party / asset / term 原样保留 - term 管法律权利义务 - access 管访问控制判决 3、关联: - policy 里的 party / asset 是属性字典,给 access 提供 subject.role、resource.type 这类取值 - policySet 里的 request 是统一输入,告诉引擎 subject 对应谁、resource 对应谁 - 授权/角色派生 SPESC 没有,所以 term 动作带实参,是显式扩展。 - term 的授权动作调用先执行,把角色派生结果交给 access 用 4、找到的xacml没有托管合约下的语义,于是Platform 义务按需补,简单例子就只留 party/asset/term/access。 5、后续使用: - 授权中心按 sub/obj 找到两份合约 - 请求只带 Subid / Objid / Act - 判决引擎只读 access和授权动作调用派生的属性,不读 term 的 must / while / where / breach - term 的付费、分账、违约留给 SPESC 投影 - Permit 后生成具体 SPESC,再发 token;资源中心验 token 放行;放行后触发链上具体 SPESC 执行 - 判决和执行读同一份主文档,但读的部分不同,所以视图一致性用双 AST 检查兜底 <meta charset="utf-8" /> <title>CBAC</title> =例1:基础policy,OASIS 规范正式例子的起点= 来源:https://docs.oasis-open.org/xacml/3.0/xacml-3.0-core-spec-os-en.html#_Toc325047096 语法:单条 Policy + 单条 Rule,Policy 级 Target 为空,Rule 级 Target 用 rfc822Name-match 对请求里的 subject-id 做邮箱域匹配;没有 Condition、Obligation、PolicySet。相比 WSO2 的 string-equal/集合比较,这里第一次出现“带类型的函数语义”(RFC822 邮箱域名匹配) ==原文:== <syntaxhighlight lang="xml"> <?xml version="1.0" encoding="UTF-8"?> <Policy xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17 http://docs.oasis-open.org/xacml/3.0/xacml-core-v3-schema-wd-17.xsd" PolicyId="urn:oasis:names:tc:xacml:3.0:example:SimplePolicy1" Version="1.0" RuleCombiningAlgId="identifier:rule-combining-algorithm:deny-overrides"> <Description> Medi Corp access control policy </Description> <Target/> <Rule RuleId="urn:oasis:names:tc:xacml:3.0:example:SimpleRule1" Effect="Permit"> <Description> Any subject with an e-mail name in the med.example.com domain can perform any action on any resource. </Description> <Target> <AnyOf> <AllOf> <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:rfc822Name-match"> <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string" >med.example.com</AttributeValue> <AttributeDesignator MustBePresent="false" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id" DataType="urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name"/> </Match> </AllOf> </AnyOf> </Target> </Rule> </Policy> </syntaxhighlight> ==逻辑结构:== Policy SimplePolicy1 (deny-overrides) ├── Target = 空(适用于所有请求) └── Rule SimpleRule1 (Permit) ├── 描述:med.example.com 域内的邮箱主体可以对任意资源执行任意动作 └── Target: subject-id (rfc822Name) 匹配 "med.example.com" ==属性表:== | `subject-id` | access-subject | `rfc822Name` | ==原始请求等效json:== { "sub": { "subjectId": "bart.simpson@med.example.com" }, "obj": { "resourceId": "file://example/med/record/patient/BartSimpson" }, "act": { "actionId": "read" } } ==转换版说明:== - 原例是单一企业内部访问策略,不是本课题“平台托管双合约”场景。为自圆其说,将其置于“Medi Corp 内部医疗资源平台”语境: -- Platform 承担身份/角色管理、核心业务授权、安全合规、生命周期治理义务; - 原 XACML 只有主体域约束,因此本文件只含一份 policy,不强行拆两份合约。 - 映射: rfc822Name-match("med.example.com", subject-id) -> subject.subjectId endsWith "@med.example.com" - 原始请求之外需要获取的其它信息: ==转换版:== policySet "OASIS3_5_MediCorpAccess" { // CBAC 追加:请求模型(判决引擎统一输入) request AuthorizationRequest { subject: Subject resource: Resource action: Action environment: Environment } combine denyOverrides // XACML 上层组合逻辑 policy "MediCorpInternalAccess" signedBy [Subject, Platform] { party Subject { // SPESC 原生参与方 ---- subjectId: rfc822Name name: String department: String employmentStatus: String } party Platform { // Platform 的“系统设计义务”,由 SPESC term 声明。 account: String authorize(role: String, subjectId: String) // 身份/角色管理 audit(actionId: String, subjectId: String) // 安全/合规执行 suspend(subjectId: String) // 治理/处罚 revoke(subjectId: String) // 生命周期终止 } // ---- SPESC 原生:资产 ---- asset Resource { info { resourceId: String resourceType: String department: String } right { } } // ---- SPESC term:法律/义务声明(不参与 Permit/Deny)--- // 身份与角色管理:平台有义务为域内用户派生 internal-user 角色 term IdentityRoleManagement: Platform must authorize("internal-user", Subject::subjectId) when Subject::subjectId endsWith "@med.example.com". // 安全与合规执行:平台有义务对访问动作审计 term SecurityComplianceAudit: Platform must audit(action.actionId, Subject::subjectId) when action.actionId in ["read", "download", "export"]. // 生命周期治理:员工离岗时平台有义务吊销访问资格 term LifecycleRevoke: Platform must revoke(Subject::subjectId) when Subject::employmentStatus = "terminated". combine permitOverrides // XACML 下层组合逻辑 access "AnyMedDomainUserAnyAction" { // 原始 XACML 规则:域内用户可对任何资源执行任何动作 target { subject.subjectId endsWith "@med.example.com" } effect Permit } signature { algorithm "ECDSA"; keyId "medi-subject-template-001"; digest "sha256:..." } signature { algorithm "ECDSA"; keyId "medi-platform-001"; digest "sha256:..." } } } =例2:rbac组合= 来源:https://docs.oasis-open.org/xacml/3.0/xacml-3.0-core-spec-os-en.html#_Toc325047096 语法:单条 Policy + 单条 Rule,Policy 级 Target 为空,Rule 级 Target 用 rfc822Name-match 对请求里的 subject-id 做邮箱域匹配;没有 Condition、Obligation、PolicySet。相比 WSO2 的 string-equal/集合比较,这里第一次出现“带类型的函数语义”(RFC822 邮箱域名匹配) ==原文:== <syntaxhighlight lang="xml"> <Policy xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" PolicyId="testOr" RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable" Version="1.0"> <Description>Test Or</Description> <Target></Target> <Rule Effect="Permit" RuleId="primary-group-emps-rule"> //Rule1:read + 组命中 admin_emps/admin → 保护接口 <Target> <AnyOf> <AllOf> <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal"> <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">read</AttributeValue> <AttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"/> </Match> </AllOf> </AnyOf> </Target> <Condition> <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-at-least-one-member-of"> <AttributeDesignator AttributeId="group" DataType="http://www.w3.org/2001/XMLSchema#string" Category="urn:oasis:names:tc:xacml:3.0:group" MustBePresent="true"/> <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-bag"> <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">admin_emps</AttributeValue> <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">admin</AttributeValue> </Apply> </Apply> </Condition> </Rule> <Rule Effect="Permit" RuleId="primary-user-rule"> //Rule2:公开版本接口,任何用户 <Condition> <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-at-least-one-member-of"> <AttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"/> <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-bag"> <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">http://localhost:8280/services/Customers/getVersion1</AttributeValue> <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">http://localhost:8280/services/Customers/getVersion2</AttributeValue> </Apply> </Apply> </Condition> </Rule> <Rule Effect="Deny" RuleId="deny-rule"></Rule> </Policy> </syntaxhighlight> ==逻辑结构:== Policy (组合: first-applicable) ├── Target = 空 ├── Rule1 (Permit) │ ├── Target: action-id = read │ └── Condition: group 属性 (类别 group)与 {admin_emps, admin} 有交集 ├── Rule2 (Permit) │ ├── Target: 无 │ └── Condition: resource-id 与 {http://localhost:8280/services/Customers/getVersion1, http://localhost:8280/services/Customers/getVersion2} 有交集 └── Rule3 (Deny) 兜底 ==属性表:== | `action-id` | `action` | string | | `group` | `group` | string | | `resource-id` | `resource` | string | ==原始请求等效json: == { "sub": { "subjectId": "alice", "groups": ["admin"] }, "obj": { "resourceId": "http://localhost:8280/services/Customers/getVersion1" }, "act": { "actionId": "read" } } ==转换版说明:== 把原策略的 3 条 Rule 直接翻成 3 条 access,没有加任何 Platform 义务 ==转换版:== policySet "WSO2_Sample6_TestOr" { request AuthorizationRequest { subject: Subject resource: Resource action: Action environment: Environment } type Action { actionId: string } type Environment { currentTime: dateTime } combine firstApplicable policy "testOr" { party Subject { subjectId: string groups: string[] // 原 XACML 的 group category readResource() // 动作声明 } asset Resource { info { resourceId: string } right { } } term PublicVersionRead: Subject can readResource when Resource::resourceId in [ "http://localhost:8280/services/Customers/getVersion1", "http://localhost:8280/services/Customers/getVersion2" ]. combine firstApplicable access "PrimaryGroupEmpsRule" { target { action.actionId = "read" } condition { some g in subject.groups such that g in ["admin_emps", "admin"] } effect Permit } access "PrimaryUserRule" { condition { resource.resourceId in [ "http://localhost:8280/services/Customers/getVersion1", "http://localhost:8280/services/Customers/getVersion2" ] } effect Permit } access "DenyRule" { effect Deny } } } *
返回至
CBAC
。
导航菜单
个人工具
登录
名字空间
页面
讨论
变种
视图
阅读
查看源代码
查看历史
更多
搜索
导航
crypto202
导航
智能合约
最近更改
SPESC
MediaWiki帮助
语言
智能法律合约
Smart Legal Contract
SPESC-ABAC 托管合约语言设计
应用
公益遗嘱链
计算管理平台
畜牧问答平台
样例
智能法律合约样例
工具
链入页面
相关更改
特殊页面
页面信息