#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 будет удален.