В приложении Spring boot RESTful, как предотвратить повторный вход зарегистрированного пользователя в систему?

#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, кажется, что только стек сервлетов поддерживает управление параллелизмом .