Я применяю JWT для аутентификации запросов. В моем Spring Cloud Gateway работает синтаксический анализ и проверка. Я сделал собственный фильтр для SecurityWebFilterChain
, который анализирует и проверяет JWT в заголовке запроса.
Я добавлю этот настраиваемый фильтр в ServerHttpSecurity, используя ServerHttpSecurity.addFilterBefore(myCustomJwtRequestFilter, UsernamePasswordAuthenticationFilter.class)
.
Я хочу использовать SecurityContextHolder.getContext().setAuthentication(authentication)
Spring Security для аутентификации запроса.
Я обнаружил, что в большинстве примеров он использует UserDetails для создания класса аутентификации.
В большинстве примеров, которые я нашел, используется UsernamePasswordAuthenticationToken
, и я обнаружил, что для этого требуется UserDetails
. Для создания UserDetails
, по сути, требуются имя пользователя, пароль и роли.
Но в моем случае я не хочу проверять свой jwt с помощью пользовательской БД каждый раз, когда я получаю запросы. Кроме того, мне не нужен пароль пользователя, поскольку я не буду проверять его после создания токена. Я хочу использовать только имя пользователя и роли в самой полезной нагрузке JWT.
Таким образом, я хочу создать класс Authentication
только с именем пользователя и ролями и установить его аутентифицированным, если проанализированный jwt проверяется с помощью моего пользовательского метода.
Он хорошо работает с настраиваемыми userDetails:
UserDetails userDetails = User.builder().username(String.valueOf(parsedInfo.get("username")))
.authorities(parsedInfo.get("roles")).password("dummypassword").build();
Но я должен установить в него фиктивный пароль, который мне не нужен.
Я думаю, что мое решение неправильно применяет пружинную безопасность. Но если я не буду использовать UserDetails, есть ли польза от использования Spring Security?
Есть ли лучшее решение для моего случая?