java - 如何在需要引用过滤器bean的grails中注册spring bean

标签 java spring grails oauth spring-security

我正在尝试使用 spring security oauth(库不是 grails 插件,只有一个非常过时的 grails 插件)。

我希望我的应用成为 OAuth 1.0a 提供者(而不是 OAuth 2)。 spring-security-oauth的OAuth2部分似乎没有这个问题,因为它不需要在provider config中引用filterchain。

我想要的是如下所示配置它:https://github.com/spring-projects/spring-security-oauth/blob/master/samples/oauth/sparklr/src/main/webapp/WEB-INF/applicationContext.xml

我把它翻译成 grails 的 groovy 语法:

consumerDetails(InMemoryConsumerDetailsService)
tokenServices(InMemoryProviderTokenServices)

xmlns oauth: "http://www.springframework.org/schema/security/oauth"
oauth.'consumer-details-service'(id:'consumerDetails') {
    oauth.consumer(name: 'AndroidRegisterApp', key:'testkey', secret:"testkey123", resourceName:'mobileApi', resourceDescription:'Register devices via mobile app')
}

oauth.provider(
        'consumer-details-service-ref': "consumerDetails",
        'token-services-ref':'tokenServices',
        'request-token-url':'/oauth/request_token',
        'authenticate-token-url':'/oauth/authorize',
        'access-granted-url':'/requestTokenAuthorized',
        'access-token-url':'/oauth/access_token',
        'filter-chain-ref':'springSecurityFilterChainProxy',
        'require10a':'true'
)

问题是当 OAuthProviderBeanDefinitionParser 在 grails 应用程序启动期间解析此配置时, springSecurityFilterChainProxy 尚不存在,因此在这里失败: https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth/src/main/java/org/springframework/security/oauth/config/OAuthProviderBeanDefinitionParser.java#L179在调用 ConfigUtils.findFilterChain 时,重要的一行是:

parserContext.getRegistry().getBeanDefinition(filterChainRef)

失败是因为 parserContext 中不存在“springSecurityFilterChainProxy”(我猜是因为它只是稍后才创建)。我还尝试通过将其放入引导代码中来推迟此初始化,如下所示:

def initOauthProvider() {
    def bb = new BeanBuilder(grailsApplication.getMainContext())
    bb.beans {
                   // same bean initialization code as above
            }
     }

这也失败了,因为这里我只有 parserContext 中的 bean,它们是我定义的一部分(它没有看到任何其他 grails bean)

有什么办法可以解决这个问题吗?我已经看到 BeanBuilder也可以使用 RuntimeSpringConfiguration 对象进行初始化,但我还没有找到任何方法从我的 grails 应用程序中获取它。

我正在使用:

  • Grails 2.2.4
  • spring-security-oauth:1.0.5 不包括:'spring-security-web'、'spring-security-core'、'spring-asm'
  • spring-security-core:2.0-RC2 grails 插件

最佳答案

您可以尝试在 grails-app/conf/spring/resources.groovy 文件中显式定义所有 Spring bean 依赖项(引用)。

这是一个示例语法:

// resources.groovy
beans = { 

    yourBean(com.company.YourBean) {
        springSecurityService = ref('springSecurityService')
        otherService = ref('otherService')
        anotherService = ref('anotherService')
    }

}

因此,在这种情况下,您应该从 yourBean bean 中初始化和访问所有三个 springSecurityService、otherService 和 anotherService。

关于java - 如何在需要引用过滤器bean的grails中注册spring bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19661745/

相关文章:

java - Json 数据无法正确从 URL 读取

java - Supervisord在Java进程中配置环境变量

java - Spring Boot 使用 Yaml 而不是属性文件

java - 为什么在 applicationContext.xml 中不接受 tomcat 的 -D 参数?

grails - Grails 2.4.4-如何在 war 阶段存储配置变量并在Tomcat环境中获取它?

java - 为什么条件运算符的结果与预期相反?

java - Weblogic 12c 与 Oracle 数据库 18c : setTransactionOnly() called on transaction error

grails - 在首次运行Grails Web应用程序时复制默认外部配置

grails - Grails-多个联接在 ListView 中显示冗余数据

java - Spring Boot/MVC/Tomcat长时间运行报错: Whitelabel Error Page