Я пытаюсь настроить Spring 3 webapp для работы в качестве прокси для другого приложения, которое обслуживает защищенный ресурс с oauth2.
Мы используем тип предоставления UsernamePassword.
Мое приложение не должно знать о пользовательской базе данных; фактически он будет запрашивать другое приложение, чтобы узнать подробности о пользователях (какие у них есть разрешения, среди прочего).
Мое приложение отвечает за отображение страницы входа.
Я хочу использовать пользовательский поставщик аутентификации Spring-Security, который будет:
- подключиться к oauth-серверу для получения токена доступа
- затем используйте OAuth2RestTemplate для запроса пользователя, который пытается войти в систему, чтобы получить его GrantedAuthorities, и другие подробности
- построить UserDetails из этого. (Мой AuthenticationProvider расширяет AbstractUserDetailsAuthenticationProvider)
Проблема:
- так как я использую для настройки своего приложения spring, spring добавляет OAuth2ClientSecurityContextFilter в цепочку фильтров
- когда вызывается метод 'retrieveUser' моего класса AuthenticationProvider, этот фильтр не был пройден до сих пор
поэтому, если я попытаюсь использовать OAuth2RestTemplate внутри моего переопределенного метода «retrieveUser», я получу исключение:
java.lang.IllegalStateException: контекст безопасности OAuth 2 не установлен. Невозможно получить доступ к ресурсу «avop-services».
в org.springframework.security.oauth2.consumer.OAuth2ClientHttpRequestFactory.createRequest (OAuth2ClientHttpRequestFactory.java:38)
в org.springframework.http.client.support.HttpAccessor.createRequest (HttpAccessor.java:76)
в org.springframework.web.client.RestTemplate.doExecute (RestTemplate.java:434)
в org.springframework.web.client.RestTemplate.execute (RestTemplate.java:401)
.. и т.д ..
(я связываю это с OAuth2ClientSecurityContextFilter из-за этой темы: http://forum.springsource.org/showthread.php?98141-error-No-OAuth-2-security-context-has-been-established)
Итак, мой вопрос:
- имеет ли смысл запускать AuthenticationProvider после воспроизведения других фильтров?
- если да, то можно контролировать порядок фильтров?
- или есть способ отложить вычисление UserDetails на более поздний этап в цепочке фильтров?
Я знаю, что это, вероятно, очень специфический случай, но мне интересно, правильно ли я атакую или я что-то упускаю.
Заранее спасибо.