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

Я применяю 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?

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


person 심시은    schedule 24.01.2020    source источник


Ответы (1)


Если вам просто нужно проверить токен 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.

person GnanaJeyam    schedule 24.01.2020
comment
Не за что. - person GnanaJeyam; 28.01.2020