6

我需要使(或踢)用户会话无效。该应用程序仅限制用户登录每个容器只有一个用户。

我尝试从会话注册表中调用 removeSessionInformation,完成解锁用户。这样其他用户就可以使用被踢出的会话用户名登录。

但是那个被踢的用户的 SessionContextHolder 仍然存在。因此他们仍然具有访问受保护页面的相同权限。

如何从指定的会话注册表信息中使 SessionContextHolder 的 Principal 无效或删除?

ps:在我的旧应用程序中,我在 UserDomain (UserDetails) 中提供了一个保存 HttpSession 的变量。当他们需要踢用户时,我只是从指定的 UserDomain 中使 HttpSession 无效。但我不知道如何在春天做到这一点(它更可能删除 SessionContextHolder 的主体而不是 HttpSession)。实现与春季的 SessionRegistryImpl 几乎相同。

4

4 回答 4

11

您可能想考虑 Spring Security 并发控制。您可以将其配置为限制每个用户的并发会话数,并在超过该数量时使现有会话过期(踢)。

Spring Security 会话管理

这是我们配置的片段(Spring 3):

<http>
    ...
    <session-management>
        <concurrency-control max-sessions="1"/>
    </session-management>
    ...
</http>
于 2011-01-06T22:10:49.770 回答
7

我猜这是这样做的方法:

SecurityContextHolder.getContext().setAuthentication(null)

来自SecurityContext.setAuthentication(Authentication)Javadocs:

更改当前经过身份验证的主体,或删除身份验证信息。

参数:authentication
- 新的身份验证令牌,如果不应存储进一步的身份验证信息,则为 null

于 2011-01-06T17:52:48.357 回答
6

您还可以执行以下操作来清除 SpringSecurity Session:

SecurityContextHolder.clearContext()
于 2014-03-20T23:59:29.620 回答
0

这是从我的 application-security.xml 中提取的

class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy"
        p:maximumSessions="1" <br>
                    **p:exceptionIfMaximumExceeded="true"** >
        <constructor-arg name="sessionRegistry" ref="sessionRegistry" />

尝试在最大会话数之后添加粗体字行

于 2013-09-19T07:03:20.560 回答