您如何在 spring-security 中注销所有已登录的用户?

Posted

技术标签:

【中文标题】您如何在 spring-security 中注销所有已登录的用户?【英文标题】:How do you log out all logged in users in spring-security? 【发布时间】:2013-01-23 00:03:44 【问题描述】:

我希望能够以编程方式注销所有已登录的用户。您如何在某些事件中强制注销所有用户?

【问题讨论】:

Answer 仅描述了如何获取有关活动会话的信息,但没有描述如何使它们无效。 @g*** - 答案是在活动会话上调用expireNow() 以导致注销。您还在寻找其他东西吗? @Neil Smithline 对如何参加本次会议保持沉默。因此答案不完整,因此作者不接受 【参考方案1】:

Ketan 会为您提供您正在寻找的答案,如果您更改第二个 for 块并使用 session.expireNow(); 而不是 activeSessions.add(session); 您最终会导致所有活动会话都过期。

【讨论】:

在哪里可以找到会话? 如果你仔细阅读Ketan的示例代码,你会发现session是从sessionRegistry.getAllSessions方法获得的。 请注意,仔细查看返回类型 你的意思是什么返回类型? getAllSessions 返回一个List<SessionInformation>,在SessionInformation 上,您可以使用expireNow() 方法使会话过期。 对不起,我不明白这一点。首先你没有找到session,然后你无法访问会话,现在这是一个过滤器的问题。如果你想结束,请提出最后一个问题。我想你的问题已经回答了。当然,正如您所说,会话稍后将被过滤器删除,但您会删除会话。如果您认为我错了,我深表歉意。【参考方案2】:

首先在web.xml中定义HttpSessionEventPublisher

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

然后在你的 spring security.xml 文件中定义&lt;session-management&gt;

现在,在您的控制器方法中使用SessionRegistry 使所有会话无效。下面的代码检索所有活动会话。

List<SessionInformation> activeSessions = new ArrayList<SessionInformation>();
    for (Object principal : sessionRegistry.getAllPrincipals()) 
        for (SessionInformation session : sessionRegistry.getAllSessions(principal, false)) 
            activeSessions.add(session);
        
    

在每个活动会话上,您都可以调用expireNow() 方法使它们过期或失效。

【讨论】:

@Maksym Demidas 如何通过 SessionInformation 获得 Session Answer 仅描述了如何获取有关活动会话的信息,但没有描述如何使它们无效。 @g*** 无法通过 Servlet API 中的 SessionInformation 获取 Session(并且有充分的理由 - 这不是安全操作)。如果你真的需要它,你可以尝试手动解决(something like this) @Maksym Demidas 实际上我搜索了以下信息:***.com/a/32477322/2674303

以上是关于您如何在 spring-security 中注销所有已登录的用户?的主要内容,如果未能解决你的问题,请参考以下文章

您如何在代理后面使用 spring-security OAuth2,但仅将 ForwardedHeaderTransformer 用于 OAuth 组件

GCM 如何使用 GCM 和 3rd 方服务器注销设备

Laravel 间歇性注销

如何注销微信小程序的授权?

Spring-Security权限管理框架——根据角色权限登录

oauth2 spring-security 如果您在请求令牌或代码之前登录