春季安全会话超时

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 节表明并发过滤器上有 is expiredUrl 属性:static.springsource.org/spring-security/site/docs/3.0.x/… 谢谢你,我会试试你说的。我的问题的问题(2)呢?您知道如何仅检查经过身份验证的用户的超时吗? (不适用于尚未进行身份验证的匿名用户)。 鉴于会话过期的方式(即它们不再存在),很难判断此人是经过身份验证还是未经身份验证。您可以使用额外的 cookie(或操作会话 cookie)来存储该信息,但无论哪种情况,您都可能需要在 Spring Security 过滤器链中实现一个过滤器来拦截并处理它。很可能,Spring Security 已经有一个地方可以插入您自己的会话处理程序,但我并不知道。如果您需要大量自定义框架,我强烈建议您深入学习该框架。 最后我用自定义会话管理过滤器解决了这个问题。看到这个:Avoid Timeout for not protected pages

以上是关于春季安全会话超时的主要内容,如果未能解决你的问题,请参考以下文章

春季安全会话超时

在春季安全中注销特定会话ID

春季安全会话到期

春季安全并发会话不起作用

从春季安全会话序列化中排除属性?

春季安全会话注册表为空