我想使用Spring Security来管理用户,组和权限。
我想使用ACL来保护我的域对象,但我找不到将组分配给acl的方法。
例如:
我有用户和组。每个集团可以拥有以下证券:
- 管理论坛(可以是像ROLE_FORUM_MANAGER
这样的角色)
- 编辑特定论坛(特定论坛上的acl)。
此外,组由具有角色ROLE_PERMISSION_MANAGER
的用户定义。但是,此用户定义的所有组只能由此用户编辑和管理。因此,组附加到用户。确切地说,假设用户创建了一个Google群组:此用户只能为他创建的群组管理权限权限组。因此,他可以创建小组来管理自己的谷歌小组的特定论坛。
我该怎么做?
我阅读了spring security docs和以下教程(所以请不要将我发送到这些链接): http://grzegorzborkowski.blogspot.com/2008/10/spring-security-acl-very-basic-tutorial.html http://blog.denksoft.com/?page_id=20
答案 0 :(得分:14)
检查Spring Security 3.0,您可以使用Spring Expression Language完全避免使用ACL。
例如,对于编辑论坛,您将获得一个像这样的方法:
@PreAuthorize("hasRole('ROLE_FORUM_MANAGER') and hasPermission(#forum,'update'))
public void updateForum(Forum forum) {
//some implementation
}
然后,您将在自定义权限评估程序中实现hasPermission方法,如:
public class ForumPermissionEvaluator implements PermissionEvaluator {
public boolean hasPermission(Authentication authentication,
Object domainObject, Object permission) {
//implement
}
public boolean hasPermission(Authentication authentication,
Serializable targetId, String targetType, Object permission) {
//implement
}
}
最后,在应用程序配置中将它连接起来:
<beans:bean id="expressionHandler"
class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
<beans:property name="permissionEvaluator" ref="permissionEvaluator"/>
</beans:bean>
<beans:bean id="permissionEvaluator"
class="com.centrix.core.security.GroupPermissionEvaluator" />
答案 1 :(得分:2)
我会像角色一样使用你的群组。我发现Spring ACL实现非常笨拙并且大部分都无法使用。只需将用户分配给“组”(实际上是角色)并按照正常的基于角色的授权进行检查。
答案 2 :(得分:1)
我做了类似'手动'的事情:即我有自己的代码来确定哪些实例可以由特定用户编辑/删除,并且只依赖Spring安全性来确保他们有正确的角色来访问功能并提供当前用户的角色/身份验证信息。
因此,在我的代码中,我确定了当前的主体(我们自己的User类),并在此基础上决定了该用户对特定实例的权限。
public static User getCurrentUser() {
User user = null;
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null) {
Object principal = auth.getPrincipal();
if (principal instanceof User) {
user = (User)principal;
}
}
return user;
}