在 Grails 中使用自己的方法扩展 SpEL?

Posted

技术标签:

【中文标题】在 Grails 中使用自己的方法扩展 SpEL?【英文标题】:Extending SpEL with own methods in Grails? 【发布时间】:2012-10-05 23:39:27 【问题描述】:

我想在 Grails 应用程序中添加自定义 SpEL 方法,就像在 this question 中为普通 Spring-Security 应用程序所做的那样,通过覆盖 EvaluationContext。这行得通吗?

如何将global-method-security 插入安全配置?我可以configure security,但是要在那里添加什么?像

grails.plugins.springsecurity = 
    'global-method-security' 
        'expression-handler' 
            ref("myMethodSecurityExpressionHandler")
        
    

?但是什么代码会解释它呢?

查看SpringSecurityCoreGrailsPlugin.groovy 也没有给我任何见解。

【问题讨论】:

【参考方案1】:

仅当您还安装了 spring-security-acl 插件时才可用。它配置了expressionHandler bean:

expressionHandler(DefaultMethodSecurityExpressionHandler) 
   parameterNameDiscoverer = ref('parameterNameDiscoverer')
   permissionEvaluator = ref('permissionEvaluator')
   roleHierarchy = ref('roleHierarchy')
   trustResolver = ref('authenticationTrustResolver')

因此,如果您有自己的 DefaultMethodSecurityExpressionHandler 子类,您可以像这样替换 resources.groovy 中的 bean:

import com.mycompany.myapp.MyMethodSecurityExpressionHandler

beans = 
   expressionHandler(MyMethodSecurityExpressionHandler) 
      parameterNameDiscoverer = ref('parameterNameDiscoverer')
      permissionEvaluator = ref('permissionEvaluator')
      roleHierarchy = ref('roleHierarchy')
      trustResolver = ref('authenticationTrustResolver')
   

【讨论】:

非常感谢。 ACL 插件可以做到这一点,但我的expressionHandler 从未被调用。应用程序的 resources.groovy 在插件的 configureExpressionBeans()/doWithSpring() 之前执行 - 所以我的 expressionHandler 可能被 ACL 覆盖。寻找解决方法。 没有设法让它接收到我的expressionHandler - 显然 ACL 已实例化。我能做什么? @VictorSergienko:成功了吗?我也有同样的情况。 遗憾的是,由于expressionHandler 的问题,它从未对我有用。

以上是关于在 Grails 中使用自己的方法扩展 SpEL?的主要内容,如果未能解决你的问题,请参考以下文章

扩展 Grails 插件的功能

Spring-Cloud-Function-Spel 漏洞复现

在 Grails 中使用 java 类

SpEL表达式

Grails 3.1.1 - 当模型类扩展另一个groovy类时,脏检查不起作用

SpEL详解