NoU*_*ame 14 java grails spring oauth spring-security
我正在尝试使用spring security oauth(库不是grails插件,只有一个非常过时的grails插件).
我希望我的应用程序成为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
我把它翻译成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'
)
Run Code Online (Sandbox Code Playgroud)
问题是当OAuthProviderBeanDefinitionParser在grails app start期间解析此配置时,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)
Run Code Online (Sandbox Code Playgroud)
失败的原因是"springSecurityFilterChainProxy"在parserContext中不存在(我想因为它只是稍后创建的).我也尝试推迟这个初始化,把它放在这样的引导代码中:
def initOauthProvider() {
def bb = new BeanBuilder(grailsApplication.getMainContext())
bb.beans {
// same bean initialization code as above
}
}
Run Code Online (Sandbox Code Playgroud)
这也失败了,因为在这里我只有parserContext中的bean是我定义的一部分(它没有看到任何其他grails bean)
有什么办法可以解决这个问题吗?我已经看到BeanBuilder也可以使用RuntimeSpringConfiguration对象进行初始化,但我还没有找到任何方法如何从我的grails应用程序中获取它.
我在用:
小智 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')
}
}
Run Code Online (Sandbox Code Playgroud)
因此,在这种情况下,您应该从 yourBean bean 中初始化并访问所有三个 springSecurityService、otherService 和 anotherService。