对Spring Security进行分组和操作

时间:2009-12-17 10:57:24

标签: spring spring-security acl roles

我想使用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

3 个答案:

答案 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;
}
相关问题