春季安全会话超时
Posted
技术标签:
【中文标题】春季安全会话超时【英文标题】:spring security session timeout 【发布时间】:2012-02-17 07:03:39 【问题描述】:我在我的 JSF2 webapp 中使用 Spring Security 3。
我有一个安全规则来提供会话超时:
<session-management invalid-session-url="/faces/paginas/autenticacion/login.xhtml?error=1" />
这样当会话过期并且用户点击任何链接时,他会被重定向到登录页面。在此页面中,我检查错误参数,并向用户显示会话已过期的消息。
但我有两个问题:
(1) 当我第一次启动应用程序时(它试图显示主页),我被重定向到登录页面,说会话已过期。我认为这可能会发生,因为您第一次运行应用程序时,会话是一个新会话,而 Spring Security 可能“认为”他已经过期(不区分新会话和超时)。
(2) 如果匿名用户的会话已过期(尚未经过身份验证),我也会被重定向到登录页面超时。我不希望未经身份验证的用户出现这种行为,我只想检查经过身份验证的用户的超时时间。
如何解决这两个问题?
提前谢谢你。
【问题讨论】:
【参考方案1】:您想对过期会话使用expired-session-url
属性,而不是invalid-session-url
。它们用于两种不同的事物。
【讨论】:
我使用的是 Spring Security 3.0.7 版本,其中没有“expired-session-url”属性。在 3.0.7 的参考文档中,他们使用“invalid-session-url”属性来检测超时(pdf 文档的第 15 页)。但是,正如您所说,无效会话与过期会话不同。你知道有什么解决办法吗? 要获得所需的灵活性(能够区分丢失和无效会话),您可能需要切换到稍微高级一点的配置。文档的第 11.3 节表明并发过滤器上有 isexpiredUrl
属性:static.springsource.org/spring-security/site/docs/3.0.x/…
谢谢你,我会试试你说的。我的问题的问题(2)呢?您知道如何仅检查经过身份验证的用户的超时吗? (不适用于尚未进行身份验证的匿名用户)。
鉴于会话过期的方式(即它们不再存在),很难判断此人是经过身份验证还是未经身份验证。您可以使用额外的 cookie(或操作会话 cookie)来存储该信息,但无论哪种情况,您都可能需要在 Spring Security 过滤器链中实现一个过滤器来拦截并处理它。很可能,Spring Security 已经有一个地方可以插入您自己的会话处理程序,但我并不知道。如果您需要大量自定义框架,我强烈建议您深入学习该框架。
最后我用自定义会话管理过滤器解决了这个问题。看到这个:Avoid Timeout for not protected pages以上是关于春季安全会话超时的主要内容,如果未能解决你的问题,请参考以下文章