Design patterns 使用ABAC,我如何表达允许主体a与主体B共享资源X的规则?
使用ABAC,很容易表达如下规则:Design patterns 使用ABAC,我如何表达允许主体a与主体B共享资源X的规则?,design-patterns,xacml,abac,Design Patterns,Xacml,Abac,使用ABAC,很容易表达如下规则: A Subject (with position = 'Manager') is allowed to perform Action (with name = 'Write') on a Resource (with class = 'Document' and type = 'Report'). 但是,在控制共享事件时,需要指定两种类型的主题:进行共享的人和预期的收件人 例如:经理可能希望与其部门的下级共享一份报告 可以将其写成一系列涉及这两类主题的规则,
A Subject (with position = 'Manager') is allowed to perform Action (with name = 'Write') on a Resource (with class = 'Document' and type = 'Report').
但是,在控制共享事件时,需要指定两种类型的主题:进行共享的人和预期的收件人
例如:经理可能希望与其部门的下级共享一份报告
可以将其写成一系列涉及这两类主题的规则,但您如何表达分享的“方向性”,例如,经理可以与下级分享,但不能与下级分享?我尝试过几种方法,但由于主题->资源->主题结构的原因,它们看起来都非常冗长,我不确定它们是否真正捕获了访问控制的内容共享的所有语义,例如在线社交网络中可能发生的情况
也许有一个基本的ABAC“设计模式”用于此…有几种方法可以在ABAC中对此进行建模。在我的示例中,我将使用ALFA作为一种语言。ALFA直接翻译成XACML 使用其他资源属性 经理可以与其部门的初级员工共享报告 在伪代码中,它将变成 如果user.department==recipient.department和recipient.level==junior,则角色为“经理”的用户可以对类型为“报告”的对象执行操作==“共享” 在本例中,属性定义如下:
- 类别访问主体的角色,类型字符串
- 类别操作的操作,类型字符串
- 类别资源的类型,类型字符串
- user.department类别访问主题,类型字符串
- recipient.department类别资源,类型字符串
- recipient.level类别资源,类型字符串
- urn:oasis:name:tc:xacml:3.0:属性类别:资源
- urn:oasis:name:tc:xacml:3.0:属性类别:操作
- urn:oasis:name:tc:xacml:3.0:属性类别:环境
- urn:oasis:name:tc:xacml:1.0:主题类别:访问主题
- urn:oasis:name:tc:xacml:1.0:主题类别:收件人主题
- urn:oasis:name:tc:xacml:1.0:主题类别:中间主题
- urn:oasis:name:tc:xacml:1.0:主题类别:代码库
- urn:oasis:name:tc:xacml:1.0:主题类别:请求机器
- 类别访问主体的角色,类型字符串
- 类别操作的操作,类型字符串
- 类别资源的类型,类型字符串
- user.department类别访问主题,类型字符串
- recipient.department类别收件人主题,类型字符串
- recipient.level类别收件人主题,类型字符串
/**
*控制对报告的访问
*/
政策集报告{
目标子句objectType==“报告”
首先适用
/**
*共享报告
*/
策略共享报告{
目标子句actionId==“共享”
首先适用
/**
*经理可以共享报告,如果。。。
*/
规则管理器{
目标子句user.role==“经理”和recipient.level==“初级”
条件user.department==recipient.department
许可证
}
}
}
在XACML中,策略变为
控制对报告的访问
http://www.w3.org/TR/1999/REC-xpath-19991116
报告
共享报告
http://www.w3.org/TR/1999/REC-xpath-19991116
分享
经理可以共享报告,如果。。。
经理
年少者
回答得很好,@david brossard!答案的关键是使用这些自定义类别,并带有“收件人”的概念,因此您可以在“交易”中按角色标记主题。在我的尝试中,我试图通过附加的AllOf
子句来实现这一点,并且不得不将动作“share”分为“share-give”和“share-receive”,这非常难看(复杂)和冗长。你的配方干净多了。用阿尔法的形式表达它会使意图更加清晰。非常感谢。