весенняя безопасность OAuth2 ClassCastException настройка DefaultTokenServices

Я пытаюсь запустить пример приложения с помощью spring boot и spring security oauth с настроенным JdbcTokenStore и DefaultTokenServices с бесконечными токенами пожизненного доступа.

запуск этого приложения с Gradle bootRun, приложение не запускается и выдает "вызвано: java.ленг.ClassCastException: com.солнце.полномочие.$Proxy51 не может быть передан в организацию.springframework.безопасность.что OAuth2.поставщик.знак.DefaultTokenServices"

Почему существует прокси обернутый вокруг Боба DefaultTokenServices?

странная вещь-запуск приложения с помощью InMemoryTokenStore ... все работает нормально (см. раздел inmemory).

Исходный Код https://github.com/grafjo/oauth_demo/blob/master/src/main/java/demo/AuthorizationServerConfiguration.java

Полная Трассировка:http://pastebin.com/SUcwz4S5

5 ответов


быстрый взгляд внутрь DefaultTokenService показывает, что он аннотирован @Transactional. Spring собирается обернуть его в прокси для обслуживания транзакций - в результате вам нужно взаимодействовать с классом по его интерфейсу.

для вашего компонента tokenService:

@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;
}

У меня тоже было подобное исключение в моем приложении, и при изменении версии spring oauth с 2.0.7.Выпуск 2.0.3.Отпустите, это сработало. Возможно, это ошибка в версии отстой?

EDIT: из ошибки кажется, что проблема связана с прокси, созданными весной. Когда я меняю тип прокси на CGLIB вместо динамических прокси по умолчанию, он также работает с версией 2.0.7. Этот параметр можно установить с помощью свойства proxyTargetClass @EnableTransactionManagement(proxyTargetClass = true)

однако это решение не привлекательно для меня, поскольку я предпочитаю метод проксирования по умолчанию, а не CGLIB. Вот также статья, объясняющая методы проксированияhttp://thecafetechno.com/tutorials/spring/spring-proxying-mechanisms/


это работает с версии 2.0.7.Отпустите

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

после изменения DefaultTokenServices на AuthorizationServerTokenServices, Spring выдаст ошибку:

нет квалификационного компонента типа [org.springframework.безопасность.что OAuth2.поставщик.знак.ResourceServerTokenServices] определено: ожидаемый одиночный соответствующий bean, но найдено 3: defaultAuthorizationServerTokenServices, consumerTokenServices, tokenServices"}}


у меня была такая же проблема с использованием 2.0.9.Выпуск в следующей комбинации:

пом.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>
...

решил проблему для меня.


добавить

<aop:config proxy-target-class="true"/> 

на вашей конфигурации весны.