2015-09-03 4 views
0

Мы используем «ConcurrentSessionControlAuthenticationStrategy» не делать, со следующей конфигурацией:Весна безопасности - expireNow() на сессии ничего

<bean 
       class="org.springframework.security.web.authentication.session.ConcurrentSessionControlAuthenticationStrategy"> 
       <constructor-arg ref="clusteredSessionRegistryImpl" /> 
       <property name="maximumSessions" value="1" /> 
       <property name="exceptionIfMaximumExceeded" value="false" /> 
      </bean> 

Когда пользователь входит в систему, а затем входит в во второй раз с другой браузер - мы видим следующий код быть вызван (как и ожидалось):

protected void allowableSessionsExceeded(List<SessionInformation> sessions, int allowableSessions, 
     SessionRegistry registry) throws SessionAuthenticationException { 
    ... 
    leastRecentlyUsed.expireNow(); 
} 

The «leastRecentlyUsed» является фактическим старше сессии (как и ожидалось). Теперь все хорошо, но тот факт, что это истечение не закончит старшую сессию, другой сеанс браузера, который должен быть истек, может по-прежнему использовать приложение в параллелизме с новым сеансом в другом браузере. похоже, что процесс фактического уничтожения сессии не состоится.

1) Кто \ Что несет ответственность за уничтожение сеанса?

2) Как мы можем исправить эту проблему?

+0

Сеанса что Уничтожен не «HttpSession», а внутренний объект, используемый Spring. Вы не можете аннулировать «HttpSession» из другого запроса. –

+0

Я знаю, но не истекающий объект, используемый весной, должен привести к тому, что httpSession будет уничтожен в конце концов? (цитата из сигнатуры истекающего метода: «Сессия« Истек »как можно скорее удаляется Filter.» – Urbanleg

+0

Если вы настроили ее таким образом, но у вас ее нет. Ваша текущая настройка молча закрывает сеанс и создает новую 1. Это связано с тем, что вы установили 'exceptionIfMaximumExceeded' в' false', который будет в основном просто переходить. –

ответ

1

У меня была аналогичная проблема, и она оказалась кешем браузера. См. Этот вопрос here

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

Update

В конце концов выяснилось, что мы используем две конфигурации в нашем внутреннем интерфейсе для контекста безопасности.

Мне пришлось сделать сеанс реестра статическим и вызвать тот же экземпляр в обеих конфигурациях.

private static final SessionRegistry SESSION_REGISTRY = new SessionRegistryImpl(); 

Тогда установка боб:

@Bean 
public static SessionRegistry sessionRegistry() { 
    return SESSION_REGISTRY; 
} 

И, наконец, использовать тот же экземпляр в обеих конфигурациях:

httpSecurity 
    ... // you configuration 
    .sessionManagement() 
     .maximumSessions(5) 
     .maxSessionsPreventsLogin(true) 
    .sessionRegistry(sessionRegistry()).and() 

Надеется, что это помогает кто-то еще :)