Есть ли какое-либо преимущество использования UserDetailsService в Spring Security при настройке членства в JWT? - PullRequest
0 голосов
/ 24 января 2020

Я применяю 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 = User.builder().username(String.valueOf(parsedInfo.get("username")))
    .authorities(parsedInfo.get("roles")).password("dummypassword").build();

Но я должен установить в него фиктивный пароль, который мне не нужен.

Я думаю, что мое решение не подходит правильно применять пружинную безопасность. Но если я не буду использовать UserDetails, будет ли выгодно использовать Spring Security?

Есть ли лучшее решение для моего случая?

1 Ответ

1 голос
/ 24 января 2020

Если вам просто нужно проверить токен JWT, тогда вы можете использовать Spring AOP для этого.

@Aspect
@Component
public class JwtAspect {

    @Before("execution(* com.yourpackageName.* (..))")
    public void checkJwtToken(JoinPoint joinPoint) {
        String jwtTOken = request.getToken();
        if (null == jwtToken) {
            throw new Exception("Token Not Found. ");
        }
        parseToken(jwtToken);
        joinPoint.proceed();
    }

}

Если вы получили токен, проанализируйте его и также проверьте срок его действия. Если выше все работает нормально, вы можете продолжить ваш JoinPoint.

...