如何在需要参考过滤豆的圣杯中注册春豆
我正在尝试使用spring security oauth(库不是圣杯插件,只有一个非常过时的圣杯插件)。
我希望我的应用是 OAuth 1.0a 提供程序(而不是 OAuth 2)。spring-security-oauth 的 OAuth2 部分似乎没有这个问题,因为它不需要在提供程序配置中引用过滤器链。
我把它翻译成圣杯的时髦语法:
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 圣杯插件