使 Spring 安全会话无效

发布于 2024-10-10 20:44:39 字数 476 浏览 7 评论 0原文

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

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

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

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

ps:在我的旧应用程序中,我在 UserDomain (UserDetails) 中给出了一个保存 HttpSession 的变量。当他们需要踢用户时,我只是使指定 UserDomain 的 HttpSession 无效。但我不知道如何在春季执行此操作(与 HttpSession 相比,更有可能删除 SessionContextHolder 的主体)。实现与Spring中SessionRegistryImpl的实现几乎相同。

i need to invalidate ( or kick ) user session. the application only limit user login only one user per container.

i try to call removeSessionInformation from session registry, its done to unlock the user. so the other user can login with the kicked session user name.

but SessionContextHolder at that user that been kicked is still. so they still have the same authority to access the protected page.

how to invalidate or remove Principal of SessionContextHolder from specified session registry information?

ps : in my old application, i give one variable in UserDomain (UserDetails) that hold HttpSession. and when they need to kick the user, i just invalidate HttpSession from specified UserDomain. the but i don't know how to do it in spring (its more likey to remove Principal of SessionContextHolder than HttpSession). implementation is almost the same with how SessionRegistryImpl do in spring.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

梦言归人 2024-10-17 20:44:39

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

Spring Security 会话管理

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

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

You may like to consider Spring Security Concurrency Control. You can configure this to limit the number of concurrent sessions per user and expire (kick) existing sessions if that number is exceeded.

Spring Security Session Management

This is a snippet of our configuration (Spring 3):

<http>
    ...
    <session-management>
        <concurrency-control max-sessions="1"/>
    </session-management>
    ...
</http>
孤云独去闲 2024-10-17 20:44:39

我猜这是这样做的方法:

SecurityContextHolder.getContext().setAuthentication(null)

来自 SecurityContext.setAuthentication(Authentication) Javadocs:

更改当前已验证的
主体,或删除
认证信息。

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

I'd guess this is the way to do it:

SecurityContextHolder.getContext().setAuthentication(null)

From the SecurityContext.setAuthentication(Authentication) Javadocs:

Changes the currently authenticated
principal, or removes the
authentication information.

Parameters: authentication
- the new
Authentication token, or null if no
further authentication information
should be stored

浅唱ヾ落雨殇 2024-10-17 20:44:39

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

SecurityContextHolder.clearContext()

You can also do the following to clear the SpringSecurity Session:

SecurityContextHolder.clearContext()
黯然 2024-10-17 20:44:39

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

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

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

This is extracted from my application-security.xml

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

try adding the line in bold letters after the maximum sessions number

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文