Spring Security和ABAC(基于属性的访问控制)

sal*_*k31 11 spring-security rbac xacml abac

我们有一个中等规模的商业应用程序,我们大量使用Spring Security角色和权限(RBAC)来为某些实例打开和关闭角色以及隐藏在@PreAuthorize标记内的SpEL中的规则.

我认为我们实际实施了什么(不知道它是ABAC).XACML看起来非常复杂和臃肿,所以我不喜欢这里的答案:

如何通过上下文更改Spring Security角色?

有没有人在没有XACML的情况下完成了轻量级的ABAC实施?我希望能够让我们分离关注点,因为域对象只是做@PreAuthorize(WRITE)等,我们的授权策略将与它分离.

从我读过的内容来看,ABAC的基本原理非常简单.您有一个Action(非常像Permission)和一种机制来解决当前Principal是否具有给定Subject的权限.

我知道AccessDecisionVoter大致是正确的接口类型,但我不认为它是用于对权限进行投票.然而,实施我们的授权政策与这样的事件似乎非常有吸引力.

抱歉这个漫无边际的问题!基本上我对ABAC很感兴趣,但我想避免家酿,但担心当我们需要Cessna时XACML是一架大型喷气式飞机.

Sri*_*air 12

您的目标似乎有两件事:

  1. 外部化授权,您希望将访问控制策略移出代码(或者至少进入代码的中心位置而不是分散在Spring代码中)
  2. 基于属性的授权,您希望使用比角色和权限更丰富的属性

我不太确定(2)因为你说你想做什么,"行动和解决当前校长有这种许可的机制",在我的书中仍然是RBAC.您是否有其他条件需要基于哪些访问授权决策?用户的位置,一天中的时间,数据库中某些数据的值,被执行的资源的属性等等.如果是这样,我们会误入ABAC世界.无论哪种方式,我都会说RBAC是ABAC的一个子集,因为角色只是一个属性.

现在,对于(1),一般模式是首先集中授权引擎并使用Spring注释来调用此authz.用于访问决策的引擎.你有两个选择:

  • 嵌入式authz.引擎:库实现引擎,并由代码作为Java函数调用.可以是XACML引擎,也可以是您自己的RBAC/ABAC实现
  • 作为网络服务:基于网络的(微)服务应答访问控制决策问题.可以是XACML引擎,也可以是您自己的RBAC/ABAC实现

为了让基于Spring的代码调用此authz.引擎,一种方法是编写自己的Spring Security选民.我发现更容易的另一种方法是编写自己的基于Spring表达式的表达式,然后可以使用现有的@PreAuthorize,@ PostAuthorize,@ PreFilter和@PostFiler,sec:authorize标签甚至来自intercept-url调用它们.条件.

这是我在使用Spring Security XACML PEP SDK时使用的.即使您决定不将XACML用于访问决策策略或请求/响应通信,该方法也应该同样有效.

  • 是的,您所描述的绝对超出了 RBAC。我认为我上面提到的方法仍然适用于您。 (2认同)
  • 这几个是开源的: - https://en.wikipedia.org/wiki/XACML#Implementations - http://incubator.apache.org/projects/openaz.html (2认同)

Ace*_*ine 5

可以在这里找到一个非常好的没有 XACML 的方法。基本上这就是你想要的。无需实现 XACML 的 ABAC 轻量级方法。 https://dzone.com/articles/simple-attribute-based-access-control-with-spring


归档时间:

查看次数:

7159 次

最近记录:

7 年,1 月 前