我拥有RESTful API和微服务架构。例如-
当前,我正在通过JWT令牌验证请求,该令牌可以从Auth服务获得。现在,实现访问控制系统的时间到了。
这是一个内部工具应用程序(相当复杂),我的主要想法是使用RBAC(基于角色的访问控制),但是该应用程序不是传统的。在应用程序中,用户A可以与另一个用户B配对,一旦完成配对,根据用户B的设置,用户A可以执行各种操作。
因此,权限不是静态的,而是基于其他变量的。那我应该去ABAC / PBAC系统吗?有什么建议么?
关于ABAC的想法
答案 0 :(得分:3)
我的偏见是:是的,您应该:-)(我为Axiomatics工作,我们所做的只是PBAC / ABAC,已经这样做了15年。)
请注意,在这种情况下,PBAC和ABAC是相同的。 PBAC实际上是一个更古老的概念。我们已经在许多地方使用政策,例如过去的网络访问控制或SDDL。
基于属性的访问控制对您(abac)的主要好处是,它使您可以随时间自由地调整访问控制策略,而不必重写应用程序。实际上,您可以将授权与应用程序分离/外部化。
下面显示了ABAC中的基本体系结构流程,组件(PEP)通过该基本流程来拦截业务流程并将其转换为授权流程(爱丽丝可以查看记录123吗?)。
策略可以用xacml或alfa编写。我更喜欢后者,因为它的语法是超级轻量级的(有关更多信息,请访问Wikipedia)。
例如,您可以编写:
namespace com.acme{
/**
* Tutorial 101 - a flat approach using 4 rules
*/
policyset recordsAccess{
apply firstApplicable
/**
* Records access control
*/
policy records{
target clause object.objectType == "record"
apply firstApplicable
/**
* R1 - A manager can view any records
*/
rule managersView{
target clause user.role == "manager" and action.actionId == "view"
permit
}
/**
* R2 - An employee can view a record in their own department
*/
rule employeesView{
target clause user.role == "employee" and action.actionId == "view"
condition user.department == record.department
permit
}
/**
* R3 - An employee can edit a record they own, if it is in draft mode
*/
rule employeeEdit{
target clause user.role == "employee" and action.actionId == "edit" and record.status == "draft"
condition com.acme.record.owner == com.acme.user.employeeId
permit
}
/**
* R4 - A manager can publish a record if the record is in final
* mode and it belongs to a employee below that manager.
*/
rule managerPublish{
target clause user.role == "manager" and action.actionId == "publish"
condition stringIsIn(stringOneAndOnly(com.acme.record.owner),com.acme.user.subordinate)
permit
}
}
}
}