У меня есть служба REST, написанная с использованием Spring MVC. Сервер является сервером ресурсов OAuth2, и я использую JwtAuthenticationProvider для анализа JWT и превращения его в принципала. Все это прекрасно работает.
Однако я действительно хочу загрузить данные пользователя из базы данных, используя имя пользователя, указанное в утверждении в JWT. Затем этот новый Принципал должен заменить или (в идеале) обернуть Jwt, чтобы он был доступен непосредственно из SecurityContext.
Я действительно изо всех сил пытаюсь понять, как это сделать. JwtAuthenticationProvider, похоже, не работает с UserDetailsService. Я также посмотрел на это с помощью конвертера - но не так просто расширить JwtAuthenticationConverter, потому что метод конвертации является окончательным (почему?).
Итак, чтобы быть очень ясным, вот что в идеале я хочу сделать:
- Токен на предъявителя предоставляется службе.
- Анализирует Jwt и извлекает утверждения
- Используйте одно из этих утверждений в качестве ключа к моей базе данных пользователей, где я могу посмотретьатрибуты, права и т. д.
- Превратите их в новый объект принципала, который доступен в объекте аутентификации SecurityContext.
Метод конфигурации в моем WebSecurityConfigurerAdapter имеет следующее:
http.authorizeRequests().antMatchers("/api/*").authenticated().and().oauth2ResourceServer().jwt();
Я не могу быть единственным человеком, который хочет использовать пользовательскую базу данных вместе с OAuth2, поэтому я должен упустить что-то фундаментальное? Я использую Spring Security 5.2.0.