Design patterns 使用ABAC,我如何表达允许主体a与主体B共享资源X的规则?

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'). 但是,在控制共享事件时,需要指定两种类型的主题:进行共享的人和预期的收件人 例如:经理可能希望与其部门的下级共享一份报告 可以将其写成一系列涉及这两类主题的规则,

使用ABAC,很容易表达如下规则:

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类别资源,类型字符串
使用收件人主题类别 现在,当然,你可以说接收者不是资源而是。。。接受者。这就是为什么XACML发明了另一种类型的主题类别,接收者主题(urn:oasis:names:tc:XACML:1.0:subject category:recipient subject)

事实上,XACML允许您定义自己的自定义类别,以及。作为提醒,XACML提供

  • 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”,这非常难看(复杂)和冗长。你的配方干净多了。用阿尔法的形式表达它会使意图更加清晰。非常感谢。