使 Spring 安全会话无效

Posted

技术标签:

【中文标题】使 Spring 安全会话无效【英文标题】:Invalidate spring security session 【发布时间】:2011-06-04 19:24:23 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

Spring Security Session Management

这是我们配置的 sn-p(Spring 3):

<http>
    ...
    <session-management>
        <concurrency-control max-sessions="1"/>
    </session-management>
    ...
</http>

【讨论】:

【参考方案2】:

我猜这是这样做的方法:

SecurityContextHolder.getContext().setAuthentication(null)

来自SecurityContext.setAuthentication(Authentication)Javadocs:

改变当前认证的 主体,或删除 身份验证信息。

参数:身份验证 - 新的 身份验证令牌,如果没有,则返回 null 进一步的认证信息 应该保存

【讨论】:

这个答案是正确的,还要确保你的网络会话无效。 嗨,布莱恩,我认为您的回答只会使当前登录用户会话的SecurityContextHolder 无效(或删除)。我需要的是删除其他用户会话的SecurityContextHolder。我们可以在 sping 做吗? 这不适用于其他用户 @z0mb1ek 不,但这也不是问题所要求的【参考方案3】:

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

SecurityContextHolder.clearContext()

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

以上是关于使 Spring 安全会话无效的主要内容,如果未能解决你的问题,请参考以下文章

spring-boot redis:如何使用户的所有会话无效?

Spring Security - 公共页面重定向到使用无效会话 ID 登录

如何在 JSF 2.0 中使会话无效?

Spring Security 注销会话未失效

如何在 Spring Security 3.1 中进行没有身份验证和授权的并发会话控制

用户注销时会话无效(Spring)