我正在开发一个支持去年春天-oauth的grail-oauth-plugin的更新版本
我的插件版本运行良好,我在oauth2服务器上实现了一个工作。
但现在我想添加一个像这样定义的自定义授权
def doWithSpring = {
myTokenGranter(MyTokenGranter)
xmlns oauth:"http://www.springframework.org/schema/security/oauth2"
oauth.'authorization-server'( /* ... many definitions here ... */){
/* ... many definitions here ... */
oauth.'custom-grant'('token-granter-ref': "myTokenGranter")
}
}
但我得到一个例外告诉我:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'myTokenGranter'
但你可以看到bean myTokenGranter的定义。如果我删除了自定义授权定义项目启动,我可以访问myTokenGranter bean。
查看fullstack跟踪,我发现异常发生在它尝试查找我的bean的行中的spring oatuh2 server bean definition parse AuthorizationServerBeanDefinitionParser.java
parserContext.getRegistry().getBeanDefinition(customGranterRef);
其中customGranterRef =“myTokenGranter”
所以我怀疑Spring Ouath或Grails BeanBuilder中存在一个错误,它不允许我的“myTokenGranter”在服务器解析器中可见。或者在grails bean定义DSL中出现一些错误。
感谢您的关注。
更深入地调试应用程序我发现问题可能在于Grails BeanBuilder如何在命名命名空间的spring DSL中工作。
如果我调试检查我的bean的点(在AuthorizationServerBeanDefinitionParser.java)
在行
parserContext.getRegistry().getBeanDefinition(customGranterRef);
如果我检查
的结果 parserContext.getRegistry().getBeanDefinitionNames()
它只显示我的豆子
[org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.annotation.internalPersistenceAnnotationProcessor
org.springframework.aop.config.internalAutoProxyCreator
org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0
org.springframework.transaction.interceptor.TransactionInterceptor#0
org.springframework.transaction.config.internalTransactionAdvisor
oauth2TokenGranter
oauth2AuthorizationCodeServices
oauth2AuthorizationRequestManager]
并非所有其他被淘汰的豆子......
即使我在resources.xml中移动ouath服务器声明,将自定义令牌granter bean声明保留在resources.groovy中,问题仍然存在。
但是如果我在resources.xml中移动自定义标记bean声明,问题就解决了。
答案 0 :(得分:0)
我真的不知道BeanBuilder DSL是如何工作的,但是如果出现问题似乎存在问题(你的例子在XML中运行得很好)。你能分两步完成吗,所以当处理OAuth2名称时,myTokenGranter的bean定义是绝对可用的吗?
答案 1 :(得分:0)
解决了黑客攻击Spring Security Oauth
请参阅此commit