使spring安全会话无效

Jeg*_*gus 6 java session spring spring-security invalidation

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

我尝试从会话注册表调用removeSessionInformation,它完成了解锁用户.所以其他用户可以使用踢脚会话用户名登录.

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

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

ps:在我的旧应用程序中,我在UserDomain(UserDetails)中提供了一个包含HttpSession的变量.当他们需要踢用户时,我只是从指定的UserDomain中使HttpSession无效.但我不知道如何在春天这样做(它更像是删除了SessionContextHolder的Principal而不是HttpSession).SessionRegistryImpl在Spring中的实现几乎与实现相同.

Cor*_*her 11

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

Spring安全会话管理

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

<http>
    ...
    <session-management>
        <concurrency-control max-sessions="1"/>
    </session-management>
    ...
</http>
Run Code Online (Sandbox Code Playgroud)


Sea*_*oyd 7

我猜这是做到这一点的方法:

SecurityContextHolder.getContext().setAuthentication(null)
Run Code Online (Sandbox Code Playgroud)

来自SecurityContext.setAuthentication(Authentication)Javadocs:

更改当前已验证的主体,或删除身份验证信息.

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


con*_*ile 6

您还可以执行以下操作以清除SpringSecurity会话:

SecurityContextHolder.clearContext()
Run Code Online (Sandbox Code Playgroud)