Почему Spring Security SessionManagementFilter работает, когда моя политика создания сеанса установлена на STATELESS?
У меня есть веб-приложение на основе J2EE REST, которое использует Spring Security 4.0.1.RELEASE. Я настраиваю Spring Security с помощью конфигурации на основе Java и настроил политику создания сеанса на STATELESS следующим образом:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(secureEnabled=true, prePostEnabled=true, jsr250Enabled=true, order=1)
public class DefaultSecurityBeansConfig extends WebSecurityConfigurerAdapter {
// ...
@Override
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()...; // additional config omitted for brevity
// ...
}
// ...
}
После прочтения этой статьи об управлении сессиями Spring Security я считаю, что SessionManagementFilter
фильтр не должен работать в цепочке фильтров Spring Security. Но это определенно так. Я могу установить точку останова в этом классе doFilter
метод, и он запускается при каждом запросе к серверу.
Что здесь происходит? Тот факт, что этот фильтр работает, вызывает другое неожиданное поведение в моем приложении, которое, как я думал, было настроено.
Благодарю.
1 ответ
При использовании Spring Security управление сеансом шире, чем сохранение аутентифицированного пользователя в сеансе (как описано в разделе " Управление сеансами" в руководстве по безопасности Spring).
Функции, связанные с сеансом HTTP, обрабатываются комбинацией
SessionManagementFilter
иSessionAuthenticationStrategy
интерфейс, которому делегирует фильтр. Типичное использование включает в себя предотвращение атак защиты с фиксацией сеансов, обнаружение тайм-аутов сеансов и ограничения на количество сеансов, которые аутентифицированный пользователь может открыть одновременно.
поговорка sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
не означает, что ваше приложение не имеет состояния, это означает, что Spring Security не будет создавать сеанс. Если в вашем приложении есть что-то еще, все еще создающее сеанс, Spring Security попытается защитить его от атаки с фиксацией сеанса.
Как выполняется атака с фиксацией сеанса, зависит от настроенной стратегии; по умолчанию изменяется идентификатор сеанса при каждом запросе. В Servlet 3.1 и более новых контейнерах ChangeSessionIdAuthenticationStrategy
является значением по умолчанию, если не выполнена явная настройка. В Servlet 3.0 и ниже, по умолчанию migrateSession
,
Вы можете отключить защиту от фиксации сеанса, выполнив sessionFixation().none()
; однако вам нужно задаться вопросом, действительно ли это то, чего вы действительно хотите, поскольку это может сделать ваше приложение менее безопасным.
В зависимости от того, что ломается / терпит неудачу, вы можете исправить это, вместо того, чтобы сделать свое приложение менее безопасным.