2013-06-14 6 views
5

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

Хотелось бы что-то вроде: invalidate (SessionId);

Возможно ли это каким-либо образом? Я думаю, что можно использовать фильтр и проверять базу данных по запросу, но есть ли другой способ, когда мне не нужно проверять db на каждом httprequest?

Спасибо. : D

ответ

3

Я думаю, что вижу решение, использующее инфраструктуру Spring Security, с классом SessionRegistry.

Вы должны зарегистрировать HttpSessionEventPublisher в web.xml:

<listener> 
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class> 
</listener> 

В вашей Спринг конфигурации, объявить SessionRegistry.

<bean id="sessionRegistry" 
    class="org.springframework.security.core.session.SessionRegistryImpl" /> 

В консоли администрирования, вы должны использовать SessionRegistry для получения SessionInformation пользователя и вызвать expireNow. При следующем запросе пользователя фильтр сервлета должен истечь срока действия HttpSession. У javadoc SessionInformation есть некоторые объяснения о том, как это работает.

Сообщите нам, если это поможет.

+0

У меня возникают проблемы, я зарегистрировал сеанс вызова * sessionRegistry.registerNewSession (String session, Object principal) *, когда я удаляю пользователя, это не сработало. сеанс пользователя все еще работает – Josema

+1

Я снова прочитал [docs] (http://static.springsource.org/spring-security/site/docs/3.0.x/reference/session-mgmt.html) и Я думаю, вам также нужно добавить '' в раздел '' вашего конфигуратора безопасности Spring. Надеюсь, это поможет. – LaurentG

+0

Почему бы не добавить это в ответ? – Alex78191

3
// to end a session of a user: 
List<SessionInformation> sessions = sessionRegistryImpl.getAllSessions(user, false); 
sessionRegistryImpl.getSessionInformation(sessions.get(0).getSessionId()).expireNow(); 

// note: you can get all users and their corresponding session Ids: 
List<Object> users = sessionRegistryImpl.getAllPrincipals(); 
List<String> sessionIds = new ArrayList<>(users.size()); 

for (Object user: users) { 
    List<SessionInformation> sessions = sessionRegistryImpl.getAllSessions(user, false); 
    sessionIds.add(sessions.get(0).getSessionId()); 
} 
0

Наряду с тем, что было предложено @LaurentG, следующие потребности, которые будут добавлены в ваш конфигурационный файл пружинной:

<session-management> 
    <concurrency-control session-registry-alias="sessionRegistry" /> 
</session-management> 

для его работы. Также для доступа к данным сеанса может использоваться ответ @zygimantus.

Смежные вопросы