您如何在 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 文件中定义<session-management>
。
现在,在您的控制器方法中使用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 组件