在春天销毁另一个用户的会话

时间:2013-06-14 11:42:50

标签: spring session spring-security sessionid

在我的应用程序中,我有一个可以删除用户的管理员。因此,当我从管理会话中删除用户时,我希望删除的用户应该自动注销。 我知道我删除了用户的会话ID,但我不知道如何使用会话ID使会话无效。

我想要类似:invalidate(SessionId);

有可能吗?我认为有可能使用过滤器并根据请求检查数据库,但是有另一种方法我不需要在每个httprequest上检查数据库吗?

感谢。 :d

4 个答案:

答案 0 :(得分:5)

我认为我看到使用Spring SessionRegistry类的Spring Security基础架构的解决方案。

您必须在HttpSessionEventPublisher注册web.xml

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

在Spring配置中,声明SessionRegistry。

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

在管理控制台中,您必须使用SessionRegistry来检索用户的SessionInformation并致电expireNow。在用户的下一个请求中,servlet过滤器应该使HttpSession过期。 SessionInformation的javadoc对其工作方式有一些解释。

如果有帮助,请告诉我们。

答案 1 :(得分:4)

// 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());
}

答案 2 :(得分:0)

除了@LaurentG的建议外,还需要在spring配置文件中添加以下内容:

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

让它发挥作用。 @zygimantus应答也可用于访问会话数据。

答案 3 :(得分:0)

除了按照所述使用户过期之外,您可能还希望将其从注册表中删除:

// expire and remove the user's sessions from Spring session registry
List<Object> principals = sessionRegistry.getAllPrincipals();
for (Object principal : principals) {
    List<SessionInformation> sessions = sessionRegistry.getAllSessions(principal, true);
    for (SessionInformation sessionInfo : sessions) {
        if (authentication.getPrincipal().equals(sessionInfo.getPrincipal())) {
           if (!sessionInfo.isExpired()) sessionInfo.expireNow();
           sessionRegistry.removeSessionInformation(sessionInfo.getSessionId());
        }
    }
}

如果使用xml config连接您的Spring Session Registry,它可能看起来像这样:

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