spring security oauth2 ClassCastException配置DefaultTokenServices

时间:2015-04-24 10:24:40

标签: spring spring-security spring-security-oauth2

我正在尝试使用spring boot和spring security oauth运行一个示例应用程序,其中包含已配置的JdbcTokenStore和一个带有无限生存期访问权限的DefaultTokenServices。

使用gradle bootRun运行此应用程序,应用程序将无法启动并抛出“由以下原因引起:java.lang.ClassCastException:com.sun.proxy。$ Proxy51无法转换为org.springframework.security.oauth2.provider .token.DefaultTokenServices“

为什么在DefaultTokenServices bean周围有代理?

奇怪的是 - 使用InMemoryTokenStore运行应用程序......一切正常(参见内存分支)。

源代码https://github.com/grafjo/oauth_demo/blob/master/src/main/java/demo/AuthorizationServerConfiguration.java

完整追踪:http://pastebin.com/SUcwz4S5

4 个答案:

答案 0 :(得分:7)

快速查看DefaultTokenService内部显示它已使用@Transactional注释。 Spring将把它包装在一个代理中来为事务提供服务 - 因此你需要通过它的接口与类进行交互。

对于您的tokenService bean:

@Bean
public DefaultTokenServices tokenServices() {
    final DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
    defaultTokenServices.setAccessTokenValiditySeconds(-1);
    defaultTokenServices.setTokenStore(tokenStore());
    return defaultTokenServices;
}

尝试将其更改为:

@Bean
public AuthorizationServerTokenServices tokenServices() {
    final DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
    defaultTokenServices.setAccessTokenValiditySeconds(-1);
    defaultTokenServices.setTokenStore(tokenStore());
    return defaultTokenServices;
}

答案 1 :(得分:3)

我的应用程序中也有类似的异常,当将spring oauth版本从2.0.7.RELEASE更改为2.0.3.RELEASE时,它工作正常。也许这是最新版本中的一个错误?

编辑:从错误看似问题与spring创建的代理有关。当我将代理类型更改为CGLIB而不是默认动态代理时,它也适用于版本2.0.7。可以通过proxyTargetClass属性@EnableTransactionManagement(proxyTargetClass = true)

设置此设置

然而,这个解决方案对我没有吸引力,因为我更喜欢默认代理方法而不是CGLIB。这里还有一篇解释代理方法http://thecafetechno.com/tutorials/spring/spring-proxying-mechanisms/

的文章

答案 2 :(得分:1)

这适用于版本2.0.7.RELEASE

 @Primary
 @Bean
 protected AuthorizationServerTokenServices tokenServices() throws Exception{

将DefaultTokenServices更改为AuthorizationServerTokenServices后,Spring将抛出错误:

  

没有类型的限定bean   [org.springframework.security.oauth2.provider.token.ResourceServerTokenServices]   定义:预期的单个匹配bean但找到3:   defaultAuthorizationServerTokenServices,consumerTokenServices,tokenServices“}}

答案 3 :(得分:0)

我在以下组合中使用2.0.9.RELEASE时遇到了同样的问题:

的pom.xml:

...    
<spring.version>4.1.4.RELEASE</spring.version>       
<spring-security.version>3.2.5.RELEASE</spring-security.version>
<spring-security-oauth2.version>2.0.9.RELEASE</spring-security-oauth2.version>
...

并有相同的例外。

降级为

...
<spring-security-oauth2.version>2.0.3.RELEASE</spring-security-oauth2.version>
...

为我解决了问题。