【问题标题】:Group and acl on Spring SecuritySpring Security 上的组和 acl
【发布时间】:2010-12-27 14:48:19
【问题描述】:

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

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

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

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

我该怎么做?

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

【问题讨论】:

    标签: spring spring-security acl roles


    【解决方案1】:

    检查 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" />
    

    【讨论】:

    • 是的,我以前见过,但由于spring security 3不是正式版本,我不会使用它,但我想我会等一会儿再使用它。
    • 要使用诸如“#forum”之类的方法参数来执行此操作,您必须在生产 JAR 中保留调试信息......这可能不是一个好主意。
    • 在 bean 连接中,最后一个元素应该是 ForumPermissionEvaluator 而不是 GroupPermissionEvaluator?另一个问题:如果你想拥有多个 PermissionEvaluator,那将如何连接,因为只有一个 expressionHandler?
    • @HDave:在生产 jar 中包含调试信息有什么影响?是性能问题吗?
    • @user316994 - 让逆向编译更加困难。
    【解决方案2】:

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

    【讨论】:

    • 所以我可以动态地创建一个像“GROUP_15”这样的权限,然后在论坛75中添加带有GrantedAuthoritySid(“GROUP_15”)的acl。如果我能做到,那对我有好处。但我需要动态创建所有角色和权限。
    • 你可以做到这一点,但不能使用 Spring Annotations,至少开箱即用。您在注释中使用的“角色”是硬编码的,不是动态的。我建议编写自己的 MethodInterceptor 并从他们那里开始 - 这是一个简单的界面,不需要太多代码。
    【解决方案3】:

    我“手动”做了类似的事情:即我有自己的代码来确定哪些实例可以由特定用户编辑/删除,并且仅依靠 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;
    }
    

    【讨论】:

    • 但我不明白您如何将 acl 应用于您的情况下的组?
    • 我并没有真正使用 acl,但组和用户都是实体并且具有(双向)关系(由休眠管理)。为了确定用户是否可以对组执行特殊操作,我检查当前主体是否是该组的主持人(即该组包含在用户的“主持人”集合中)。因此,每个组的版主列表基本上是该组的“ACL”,并且在数据库中管理,而不是在 spring 安全配置中。
    猜你喜欢
    • 2013-10-06
    • 1970-01-01
    • 2019-07-18
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    相关资源
    最近更新 更多