7

我想使用 Spring Security 来管理用户、组和权限。

我想使用 ACL 来保护我的域对象,但我找不到将组分配给 acl 的方法。

例如:我有用户和组。每个组可以有以下证券: - 管理论坛(可以是类似的角色ROLE_FORUM_MANAGER) - 编辑特定论坛(特定论坛上的 acl)。

此外,组由具有角色的用户定义ROLE_PERMISSION_MANAGER。但是该用户定义的所有组只能由该用户编辑和管理。因此,组附加到用户。确切地说,假设用户创建了一个 google 组:该用户只能为他创建的组管理权限组。所以他可以创建组来管理自己的google组的特定论坛。

我该怎么做?

我阅读了 spring 安全文档和以下教程(所以请不要将我发送到这些链接): http: //grzegorzborkowski.blogspot.com/2008/10/spring-security-acl-very-basic-tutorial.html http://blog.denksoft.com/?page_id=20

4

3 回答 3

16

检查 Spring Security 3.0,您可以通过使用 Spring 表达式语言完全避免使用 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="x.y.z.ForumPermissionEvaluator" />
于 2009-12-20T12:06:58.577 回答
2

我只会使用您的组,例如角色。我发现 Spring ACL 实现非常笨拙,并且大部分无法使用。只需将用户分配给“组”(实际上是角色)并像正常的基于角色的授权一样检查它们。

于 2009-12-18T16:10:49.130 回答
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;
}
于 2009-12-18T10:28:44.887 回答