如何在需要参考过滤豆的圣杯中注册春豆

2022-09-04 04:51:56

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

我希望我的应用是 OAuth 1.0a 提供程序(而不是 OAuth 2)。spring-security-oauth 的 OAuth2 部分似乎没有这个问题,因为它不需要在提供程序配置中引用过滤器链。

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

我把它翻译成圣杯的时髦语法:

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)

它失败了,因为“springSecurityFilterChainProxy”在解析器Context中不存在(我猜是因为它只是在以后才被创建)。我还尝试推迟此初始化,方法是将其放在引导代码中,如下所示:

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

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

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

我正在使用:

  • 圣杯 2.2.4
  • spring-security-oauth:1.0.5,不包括:'spring-security-web', 'spring-security-core', 'spring-asm'
  • 弹簧-安全-核心:2.0-RC2 圣杯插件

答案 1

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

下面是一个示例语法:

// resources.groovy
beans = { 

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

}

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


答案 2

在资源文件夹中添加现有的 xml 文件,然后使用以下命令

beans = {
   importBeans('classpath:/applicationContext-services.xml')
}

推荐