Может ли Spring Security обнаружить, что текущий сеанс не согласуется с пользователем

#session #spring-security

#сессия #spring-security

Вопрос:

Сейчас я использую Spring security, у меня есть такой сценарий в моем веб-приложении:

шаг 1: войдите в систему с помощью user-A и откройте страницу с двумя вкладками браузера

шаг 2: пользователь-выход из системы на первой вкладке и ничего не делайте со второй вкладкой

шаг 3: войдите в систему с помощью user-B, откройте ту же страницу на первой вкладке (обратите внимание, что теперь SessionID должен быть user-B)

шаг 4: отправьте ajax-запрос во второй вкладке

Моя конфигурация выглядит следующим образом:

 @Configuration
@EnableWebSecurity
public class AuthConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/css/**", "/index").permitAll()       
                .antMatchers("/user/**").hasRole("USER")            
                .and()
            .formLogin()
                .loginPage("/login").failureUrl("/login-error");    

    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user1").password("pass").roles("USER")
                .and()
                .withUser("user2").password("pass").roles("USER");
    }
}
 

/login: URL страницы входа в систему

/пользователь/индекс: url бизнес-страницы

Ожидаемый результат заключается в том, что этот запрос на шаге 4 должен быть заблокирован серверной частью (например, return a 401), напоминая ему о повторном входе в систему.

Но фактический результат таков: этот запрос возвращается с данными пользователя B.

Итак, как достичь ожидаемого результата с помощью spring security?

Кажется, этот вопрос может быть не полностью связан с Spring Security, я обновляю этот вопрос как более общий вопрос: как достичь ожидаемого результата на шаге 4? Нужно ли сохранять информацию о сеансе в хранилище сеансов или html?

Комментарии:

1. Это не проблема безопасности Spring. Браузеры совместно используют файлы cookie на всех вкладках. Некоторые браузеры (например, E) позволяют открывать новый сеанс браузера в новом окне браузера, чтобы устранить эту проблему. Некоторые серверы позволяют добавлять идентификатор сеанса к URL-адресу в качестве параметра запроса, чтобы устранить эту проблему.

2. Другой способ — использовать Spring Session.

3. Извините, вы сказали, что «некоторые серверы позволяют добавлять идентификатор сеанса к URL-адресу в качестве параметра запроса», интересно, где идентификатор сеанса сохраняется в клиенте? Если он сохранен только в файле cookie, он не может работать, поэтому должен ли он быть сохранен в html / session storage?

4. Сервер возвращает идентификатор сеанса как cookie, а клиент отправляет идентификатор сеанса как cookie. Это временный файл cookie, если вы закроете браузер (все вкладки), файл cookie будет удален.