весенняя безопасность 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>
...
решил проблему для меня.