您存储策略的位置在很大程度上无关紧要。这将取决于您使用的引擎,例如 AuthZForce(我已经 ping 了作者,以便他可以加入)、SunXACML、WSO2 或 Axiomatics。
免责声明:我为 Axiomatics 工作。我们确实使用数据库来存储 XACML 策略,但这不会改变授权要求或建模。
我对您的原始帖子有一些评论。
subject.id==resource.ownerId
就是我们通常所说的 XACML 中的条件。您将 2 个属性一起比较以实现关系。
- 您提到权限,例如
DELETE_USER
. 在 XACML 中,您通常将它们拆分为原子属性,例如一方面是动作,另一方面是对象或资源 ( USER
)。RBAC 是基于角色和权限的,而 ABAC 是基于属性的。理想情况下,这些属性表示一个方面(作为用户,试图删除......)
ROLE
ABAC 中仍然存在。这将是您制定政策的基础。
- 功能和公司是您将使用的属性。
考虑到这一点,您可以编写如下策略(使用 ALFA 表示法):
namespace axiomatics{
namespace user{
attribute role{
category = subjectCat
id = "axiomatics.user.role"
type = string
}
attribute company{
category = subjectCat
id = "axiomatics.user.company"
type = string
}
attribute userId{
category = subjectCat
id = "axiomatics.user.userId"
type = string
}
}
namespace action{
attribute actionId{
category = actionCat
id = "axiomatics.action.actionId"
type = string
}
}
namespace resource{
attribute company{
category = resourceCat
id = "axiomatics.resource.company"
type = string
}
attribute owner{
category = resourceCat
id = "axiomatics.resource.owner"
type = string
}
}
policyset springapp{
apply firstApplicable
policy employees{
target clause user.role == "employee"
apply firstApplicable
/**
* Employees can create roles in their own company
*/
rule createRole{
target clause action.actionId=="create"
condition user.company==resource.company
permit
}
/**
* Employees can delete roles they own
*/
rule allowDelete{
target clause action.actionId == "delete"
condition user.userId == resource.owner
permit
}
}
}
}