2015-11-24 148 views
1

我不是Spring 4的新手,但我是Spring Security 4 ACL的新手。我刚刚在我的MVC web-app上实现了Spring Security 4,这些都是后端Web服务。一个链接,我做了什么张贴在这里:Spring Security 4 ACL为用户和角色分配权限

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

而这增加了我的URL的安全性,只有具有特定角色的用户可以请求一个URL。这很棒!我们使用SiteMinder示例,而不是传回用户名,而是在请求标头中回传令牌。我们打电话给OpenAM传递这个令牌,我们找回一个用户名。我们使用Hibernate Authentication从我们的数据库获取用户信息,我们为该用户获取角色,并为我们制作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) 

所以,既可以在用户和角色都有不同的权限,一个对象?

我们有三种不同的对象类型:汽车,动物,花朵 我们希望使用ACL为用户和角色分配不同的权限,以满足这些对象类型的每一种。

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

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

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

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

回答

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条目上处理多个权限;这意味着您必须添加一个条目来创建,一个用于读取,等等。

+0

太棒了!感谢您的信息。我会让你知道结果如何。 – tjholmes66