#spring #spring-boot #rest #spring-security #restful-authentication
#spring #spring-boot #rest #spring-безопасность #restful-аутентификация
Вопрос:
Я создал простое приложение restful с помощью springboot. У него есть только два API, login и signup. После входа пользователя в систему он возвращает jwt. Вот моя конфигурация
protected void configure(HttpSecurity http) throws Exception {
http.cors().and().csrf().disable()
.exceptionHandling()
.authenticationEntryPoint(unauthorizedHandler)
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers(HttpMethod.GET, "/api/**").permitAll()
.antMatchers(HttpMethod.POST, "/api/auth/**").permitAll()
.antMatchers(HttpMethod.GET, "/api/users/checkUsernameAvailability", "/api/users/checkEmailAvailability").permitAll()
.anyRequest().authenticated();
http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
}
Проблема в том, что я заметил, что аутентифицированный пользователь может снова вызвать / войти в API с возвращением нового токена jwt.
Есть ли способ настроить какой-либо API только для не прошедшего проверку подлинности пользователя? Нравится .antMatchers(HttpMethod.POST, "/api/auth/**").unauthenticatedOnly()
Если нет конфигурации, на мой взгляд, обходной путь заключается в добавлении is_authenticated
столбца в таблицу пользователей и аутентификации только пользователя, чей is_authentiacted = false
. Это хороший способ?
Комментарии:
1. Внутри фильтра
jwtAuthenticationFilter
не могли бы вы проверить, является ли URL/api/auth/**
и токен JWT действительным (зарегистрированный пользователь), а затем перенаправить?
Ответ №1:
Если вы хотите проверить наличие токена jwt на стороне сервера, я думаю, что токен должен быть сохранен в хранилище, таком как Redis и т.д., И проверить его с помощью фильтра (установите его в Spring Security).
Возможное простое решение — использовать вместо этого сеанс Spring, если вы хотите управлять им с помощью самой Spring Security (без дополнительной работы).
Весенняя сессия похожа на HttpSession, но поддерживается Redis, Mongo и т.д., Таким образом, вы можете использовать стратегию параллелизма сеанса, предусмотренную в Spring Security, чтобы гарантировать, что действительна только одна аутентификация пользователя. Вы должны переключиться на отслеживание состояния в своем бэкэнде.
Лично я использовал Spring session в нескольких проектах (обеспечивает RESTful API), я думаю, что это хорошо. Вот пример использования Spring session (реактивный стек)(но я не настроил правило управления сеансом). Вот пример микросервиса (стек сервлетов).
Комментарии:
1. Звучит многообещающе. Я проверю документацию по репозиторию spring session. Спасибо!
2. Я просмотрел Spring security, кажется, что только стек сервлетов поддерживает управление параллелизмом .