spring security oauth2 ClassCastException配置DefaultTokenServices

joo*_*joo 7 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

小智 7

快速浏览DefaultTokenService,可以看到它是用@Transactional注释的.Spring将把它包装在代理中以服务事务 - 因此你需要通过它的接口与类进行交互.

对于您的tokenService bean:

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

尝试将其更改为:

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