如何在 Spring Security 中编辑定时注销
Posted
技术标签:
【中文标题】如何在 Spring Security 中编辑定时注销【英文标题】:How to edit timed logout in Spring security 【发布时间】:2011-09-09 15:17:48 【问题描述】:我正在试图弄清楚 Spring 轻安全的定时注销功能在哪里,以及如何编辑它以使用我的自定义注销方法。 我的理解是确实存在一个可编辑的定时注销功能,到目前为止我还没有找到它,当/如果我找到它,我不确定如何让它使用我的注销序列。
谢谢, 镜像命运
为清晰而编辑:
它是一个 web/servlet 应用程序。我正在使用 acegi 安全性。
我现在正在使用 Spring 会话超时:
In web.xml:
<session-config>
<session-timeout>5</session-timeout>
</session-config>
当这个超时发生时,我需要一种方法来执行一些代码。但是,我不知道该怎么做。
如果我无法使用这种方法执行代码,我的理解是acegi有办法让会话超时;但是,我也不知道该怎么做。我已经能够使用 acegi 在正常注销时执行代码:
<security:logout invalidate-session="true"
success-handler-ref="Logout"
logout-url="/logout.html" />
</security:http>
那么,本质上,我该如何做同样的事情,无论是使用 acegi 定时注销还是发生会话超时?
【问题讨论】:
澄清一下,您说的是会话计时器吗?例如一个倒计时的计时器,当它完成时,结束用户的会话? 啊,也许……这或多或少是我所指的……据我了解,Spring 安全性具有此功能(我真的不太了解 Spring),并且可以设置时间量,以及时间用完时要做什么。我想知道具体如何做到这一点。这完全澄清了吗? 什么类型的应用程序?网络/小服务程序? GUI,桌面等?需要更多细节来帮助您。 这是一个 web/servlet 应用程序。只要告诉我哪些信息有用,我就会提供。 【参考方案1】:HttpSessionListener
可能是您正在寻找的。依赖 Spring 的会话管理的问题在于,如果用户只是关闭浏览器而不注销,将永远无法到达 invalid-session-url(因为他们永远不会发出另一个请求)。
类似这样的:
public class MySessionListner implements HttpSessionListener
public void sessionCreated(HttpSessionEvent se)
return; //or maybe do something, depends on what you need
public void sessionDestroyed(HttpSessionEvent se)
HttpSession session = se.getSession();
//do whatever you need to do
然后在web.xml
:
<listener>
<listener-class>com.foo.MySessionListener</listener-class>
</listener>
这样,您的代码将在每次会话被销毁时调用,而不仅仅是在用户在超时后尝试访问页面时调用。希望对您有所帮助。
【讨论】:
这就是我想要的。 w00t!如果我还没有选择其他人的答案,我会选择这个。 @MirroredFate 我认为您可以将答案切换到这个。它确实更好地回答了你的问题。 (我发现它也很有用)【参考方案2】:会话超时期限由您的应用程序服务器管理(就像您现在在 web.xml
中一样)。可以在 Spring 中指定对发生会话超时时发生的情况的处理。例如,Spring 3.0 可以指定当用户在会话失效后发出请求时将用户重定向到哪个页面。见下文。
<?xml version="1.0" encoding="UTF-8"?>
<b:beans xmlns:b="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sec="http://www.springframework.org/schema/security"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<sec:http auto-config="true" access-denied-page="/login">
<sec:session-management invalid-session-url="/session-timeout" />
<sec:anonymous enabled="true" />
<sec:intercept-url ... />
<sec:form-login ... />
<sec:logout invalidate-session="true" logout-success-url="/login" />
</sec:http>
<!-- Other bean declarations -->
</b:beans>
【讨论】:
与应用程序相关的内容应该放在哪里?我的意思是,它是放在 web.xml 中,还是应用程序上下文中,还是...*叹气*...谢谢您的回答,无论如何。 您可能有一个类似$app.name-servlet.xml
的文件。听起来您知道如何创建单独的上下文文件(即application-context.xml
)。有关于如何将您的安全上下文分离到第三个文件的文档。见static.springsource.org/spring-security/site/…
...我认为这在我的脑海中过于复杂了...我理解设置无效会话 url,但是如何让它使用我的自定义代码,因为它确实如此对于注销功能?我需要给它一个 Logout bean 的引用,你知道怎么做吗?特维姆。
如果我已经回答了您原来的问题,请标记为已回答。您在问是否有任何方法可以覆盖或添加额外的功能到股票注销?我不确定,因为我不需要自己做。我建议阅读 Spring Security 3.0 文档。您可能需要创建一个注销过滤器。
是的,我现在正在阅读文档。我想我会将这个问题标记为已回答,尽管它并没有真正得到回答。我的问题是关于如何执行代码,而您的答案似乎是关于如何在发生超时时更改重定向。这是朝着正确方向迈出的一步,非常有帮助,因此我将其标记为答案。以上是关于如何在 Spring Security 中编辑定时注销的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Spring Security 处理基于用户权限的授权?
拒绝Spring Security中具有相同角色的多个用户的访问