Spring Security 4 ACL为用户和角色分配权限

时间:2015-11-24 20:17:11

标签: spring spring-mvc spring-security spring-security-acl

我不是Spring 4的新手,但我是Spring Security 4 ACL的新手。我刚刚在我的MVC网络应用程序上实现了Spring Security 4,它们都是后端Web服务。我所做的链接在这里发布:

http://stackoverflow.com/questions/33787085/spring-security-4-with-third-party-authentication-token

这增加了我的URL的安全性,即只有具有特定角色的用户才能请求URL。这很棒!我们采用了SiteMinder示例,而不是传回用户名,我们在请求标头中传回一个标记。我们调用OpenAM传递此令牌,然后我们返回一个用户名。我们使用Hibernate身份验证从我们的数据库中获取用户信息,我们为该用户获取角色并为我们创建UserDetails,并且以这种方式,我们为此经过身份验证的用户提供了一个SecurityContext。

但是现在我在同一个MVC网络应用程序中遇到了新的挑战,那就是我想为我的对象添加ACL安全性。我已经做了很多研究,还有更多的问题。

似乎我可以使用ACL表应用安全性(创建和/或检索和/或删除和/或更新和/或等)。我想知道是否可以像这样应用安全性:

userA    SomeCarObject     has permissions (create,read,update)
userB    SomeCarObject     has permissions (read)
roleA    SomeCarObject     has permissions (update)
roleB    SomeCarObject     has permissions (delete)

那么,用户AND角色是否可以对对象具有不同的权限?

我们有三种不同的对象类型:汽车,动物,鲜花 我们希望使用ACL为用户和角色分配对每种对象类型具有不同的权限。

可以在Spring Security 4中使用ACL完成吗?你知道那里有什么好的例子吗?或者,我们必须拥有所有用户权限吗? 因此,如果我们有3个用户的角色,那么我们需要在acl表中有3个条目,每个用户一个?这引出了一个问题......如果用户更改角色,那么我们必须重新评估他们的权限,我们可能必须在ACL表中添加或删除记录?

我也在研究权限的工作原理。我们目前在旧系统中使用位掩码来跟踪权限,所以我们有recursiveRead(1),read(2),write(4),delete(8),create(16),upload(32),关闭(64)等。似乎我们可以拥有32位许可,这对我们来说非常有用。

所以,我正在研究如何在ACL中定义这些权限。

随着我获得更多信息,我一定会在这里发布。谢谢!

1 个答案:

答案 0 :(得分:2)

  

因此,两个用户和角色都可以拥有不同的权限   对象

是的,Spring Security中有一个名为Sid的东西 - 安全身份,可以是权限(角色)或主体(用户)。

假设您使用的数据库模式类似于参考文档中的数据库模式,您的acl_sid表应如下所示:

 +----+-----------+-------+
 | id | principal | sid   |
 +----+-----------+-------+
 |  1 | true      | userA |
 |  2 | true      | userB |
 |  3 | false     | roleB |
 |  4 | false     | roleB |
 +----+-----------+-------+

然后在ACL中添加条目时使用此表中的id。

  

这引出了一个问题......如果用户改变角色,那么我们会这样做   必须重新评估他们的权限,我们可能必须添加或   从ACL表中删除记录?

这不应该是必要的,但要注意缓存。如果在ACL表中添加/删除记录,请记住如果使用,请清除AclCache

  

我也在研究权限如何运作。

默认权限在BasePermission类中定义,并使用位掩码模式。但请注意,Spring Security ACL实现处理同一ACL条目的多个权限;这意味着你必须为create添加一个条目,一个用于read,等等。