【问题标题】:Grails ACL with Custom Permissions具有自定义权限的 Grails ACL
【发布时间】:2012-03-05 08:38:05
【问题描述】:

grails 的 Spring Security ACL 插件默认使用具有 4 个基本权限的 BasePermission 类。并使用 DefaultFactory 分配此权限。以及分配此 DefaultFactory 的 AclPermissionEvaluator。

当使用这种方法时,一切都很好。我可以使用

    @PreAuthorize("hasPermission(#report, read)")

在这里,我提供了一种称为 READ 的基本权限,它在 BasePermission 类中定义。

我需要的是我自己的自定义权限。 我已经完成了:

     public class MyPermission extends AbstractPermission{

        public static final Permission APPROVE= new MyPermission(1 << 0, 'a');

        //constructors here..  
     }

1) 如何正确分配我的自定义权限以使用它,就像我使用来自 BasePermission 的权限一样? 2)我应该定义我的CustomFactory还是可以使用DefaultFactory? 3)如果是,如何将其设置为现有的权限评估器?

还有另一个悬而未决的问题。我玩过 BasePermission 的子类,但在这种情况下我应该使用

    @PreAuthorize("hasPermission(#report, 'approve')")

而不仅仅是

    @PreAuthorize("hasPermission(#report, approve)")

4)为什么在没有单引号的情况下出现错误?

     Class:org.springframework.expression.spel.SpelEvaluationException
     Message:EL1008E:(pos 28): Field or property 'approve' cannot be found on object of type 'org.springframework.security.access.expression.method.MethodSecurityExpressionRoot'

提前致谢!

【问题讨论】:

    标签: spring grails permissions acl


    【解决方案1】:

    您最好扩展org.springframework.security.acls.domain.BasePermission,因为这样您就拥有所有标准权限以及您的权限:

    package com.mycompany.myapp.MyPermission;
    
    public class MyPermission extends BasePermission {
    
       public static final Permission APPROVE = new MyPermission(1 << 5, 'V'); // 32
    
       protected MyPermission(int mask) {
          super(mask);
       }
    
       protected MyPermission(int mask, char code) {
          super(mask, code);
       }
    }
    

    您需要在权限工厂注册它才能在表达式中使用它;覆盖grails-app/conf/spring/resources.groovy 中的aclPermissionFactory bean,将您的类作为构造函数参数传递:

    import org.springframework.security.acls.domain.DefaultPermissionFactory
    import com.mycompany.myapp.MyPermission
    
    beans = {
       aclPermissionFactory(DefaultPermissionFactory, MyPermission)
    }
    

    它在标准权限下不加引号的原因是MethodSecurityExpressionRoot 具有标准权限的常量:

    public final String read = "read";
    public final String write = "write";
    public final String create = "create";
    public final String delete = "delete";
    public final String admin = "administration";
    

    但没有适合您的,因此您需要引用它以强制在您的权限类中查找。

    【讨论】:

    • 感谢您的回答!它很有帮助。但可以澄清一下,覆盖aclPermissionFactory bean 的正确位置在哪里?直接在SpringSecurityAclGrailsPlugin.groovy 的插件中?因为,默认情况下,所有插件都存储在 %USER_HOME%/... 中,这意味着如果其他人签出这个项目,他将获得默认配置。
    • 否 - 避免编辑插件代码。在 grails-app/conf/spring/resources.groovy 中执行此操作 - 我编辑了答案以澄清这一点。
    • 有没有办法扩展 MethodSecurityExpressionRoot 所以我不必使用引号?我不喜欢它不一致,你必须知道有些权限需要引号而有些不需要
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 2016-03-09
    • 2017-04-15
    • 1970-01-01
    • 2014-01-08
    • 2015-10-01
    • 2015-11-27
    相关资源
    最近更新 更多