Почему 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(); однако вам нужно задаться вопросом, действительно ли это то, чего вы действительно хотите, поскольку это может сделать ваше приложение менее безопасным.

В зависимости от того, что ломается / терпит неудачу, вы можете исправить это, вместо того, чтобы сделать свое приложение менее безопасным.

Другие вопросы по тегам