Spring Security: Как использовать UserDetailsService с JwtAuthenticationProvider? - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть служба REST, написанная с использованием Spring MVC. Сервер является сервером ресурсов OAuth2, и я использую JwtAuthenticationProvider для анализа JWT и превращения его в принципала. Все это прекрасно работает.

Однако я действительно хочу загрузить данные пользователя из базы данных, используя имя пользователя, указанное в утверждении в JWT. Затем этот новый Принципал должен заменить или (в идеале) обернуть Jwt, чтобы он был доступен непосредственно из SecurityContext.

Я действительно изо всех сил пытаюсь понять, как это сделать. JwtAuthenticationProvider, похоже, не работает с UserDetailsService. Я также посмотрел на это с помощью конвертера - но не так просто расширить JwtAuthenticationConverter, потому что метод конвертации является окончательным (почему?).

Итак, чтобы быть очень ясным, вот что в идеале я хочу сделать:

  1. Токен на предъявителя предоставляется службе.
  2. Анализирует Jwt и извлекает утверждения
  3. Используйте одно из этих утверждений в качестве ключа к моей базе данных пользователей, где я могу посмотретьатрибуты, права и т. д.
  4. Превратите их в новый объект принципала, который доступен в объекте аутентификации SecurityContext.

Метод конфигурации в моем WebSecurityConfigurerAdapter имеет следующее:

http.authorizeRequests().antMatchers("/api/*").authenticated().and().oauth2ResourceServer().jwt();

Я не могу быть единственным человеком, который хочет использовать пользовательскую базу данных вместе с OAuth2, поэтому я должен упустить что-то фундаментальное? Я использую Spring Security 5.2.0.

1 Ответ

0 голосов
/ 04 ноября 2019

Я согласен с вашими проблемами - и я считаю полезным переопределить обработку Spring по умолчанию.

Существует шаблон кэширования утверждений, который я использую, и обработка JWT - это только одна часть: https://authguidance.com/2017/10/03/api-tokens-claims/

У меня есть пример кода Spring Boot, который вы можете запустить - он использует настраиваемый фильтр и классы Connect2Id - здесь описана интеграция OAuth: https://authguidance.com/2019/03/24/java-spring-boot-api-oauth-coding/

Здесь есть конкретные классы OAuth, если вы просто хотитепросмотрите код: https://github.com/gary-archer/authguidance.apisample.javaspringboot/tree/master/src/main/java/com/mycompany/sample/framework/api/oauth/security

Рад ответить на любые последующие вопросы, если это поможет

...