У меня есть два отдельных приложения Spring Boot, один из которых служит сервером авторизации OAuth 2, а другой - как сервер ресурсов. Я использую Spring RemoteTokenServices
на моем сервере ресурсов для проверки токенов с сервера авторизации. Теперь я пытаюсь определить защищенный код контроллера в своем приложении сервера ресурсов, но я не уверен, как сопоставить класс UserDetails
с принципалом аутентификации, предоставляемым через механизм OAuth 2.Как сопоставить токен OAuth 2 с объектом UserDetails на сервере ресурсов?
Я установил свой сервер авторизации с настраиваемым TokenEnhancer
, который добавляет дополнительную информацию к токену, так что /oauth/check_token?token=<token>
возвращает с настраиваемыми полями, которые я хочу сопоставить с контроллерами серверов ресурсов.
В более монолитной установке, где сервер авторизации является также ресурсы сервером, я могу определить методы контроллера, которые используют аутентифицированный принципал таким образом:
//User implements UserDetails
public Map<String, Object> getResource(@AuthenticationPrincipal User user) {
//code that uses the user object
}
Однако, это не похоже на работу как прямо вперед в более распределенном подходе. Отображение не выполняется, и параметр user
оказывается нулевым объектом. Я попытался с помощью следующего подхода:
public Map<String, Object> getResource(Authentication authentication) {
//code that uses the authentication object
}
Хотя приведенный выше код успешно отображает параметры аутентификации, он не обеспечивает способ для меня, чтобы получить прямой доступ к настраиваемых полей, которые я указал через TokenEnhancer
я упоминал ранее. Кажется, я ничего не могу найти в документах Spring об этом.
Это решение работает, но это скорее обходное решение, чем исправление. Причина, по которой вы получаете String for Princip, заключается в том, что userDetailsService неправильно введен в DefaultUserAuthenticationConverter(). Теперь вопрос заключается в том, где его нужно вводить, чтобы это обходное решение не требовалось? – zalis