我不是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中定义这些权限。
随着我获得更多信息,我一定会在这里发布。谢谢!
答案 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,等等。