导航到 Spring Security 登录页面重定向到 invalid-session-url

Posted

技术标签:

【中文标题】导航到 Spring Security 登录页面重定向到 invalid-session-url【英文标题】:navigating to spring security login page redirects to invalid-session-url 【发布时间】:2014-02-20 18:45:07 【问题描述】:

为了在会话超时时将用户重定向到我想要的 url,我最近将以下内容添加到我的 spring 安全文件中......

<http pattern="/resources/**" security="none"/>
<http pattern="/resources/js/**" security="none"/>
<http pattern="/resources/css/**" security="none"/>
<!-- excluded pages -->
<http pattern="/login.htm" security="none"/>
<http pattern="/j_spring_security_check" security="none"/>
<http pattern="/accessDenied.htm" security="none"/> 
<http pattern="/error.htm" security="none"/>

<http use-expressions="true" auto-config="false" entry-point-ref="loginUrlAuthenticationEntryPoint">    
    <!-- custom filters -->
    <custom-filter position="FORM_LOGIN_FILTER" ref="twoFactorAuthenticationFilter" />      
    <custom-filter after="SECURITY_CONTEXT_FILTER" ref="securityLoggingFilter"/>
    <!-- session management -->     
    <session-management 
        invalid-session-url="/sessionExpired.htm" 
        session-authentication-error-url="/alreadyLoggedIn.htm">

        <concurrency-control 
            max-sessions="1" 
            expired-url="/sessionExpiredDuplicateLogin.htm" 
            error-if-maximum-exceeded="false" 
            session-registry-alias="sessionRegistry"/>

    </session-management>   

当会话在下次单击时到期时,用户将被带到 /sessionExpired.htm,这是所需的效果但是我现在在导航到登录页面 (login.htm) 时遇到问题,我被重定向到无效 -会话 URL (/sessionExpired.htm)。

显然这不是我想要发生的。我一直在阅读它,建议的解决方案之一似乎是像这样删除 jsessionid cookie,并将 invalidate-session 设置为 false(我现在在 logout.htm 的控制器方法中使会话无效)...

<logout logout-success-url="/logout.htm" invalidate-session="false" delete-cookies="JSESSIONID"/>

我尝试过但似乎不起作用。有人可以帮我了解这里发生的事情以及我可以如何解决吗?似乎当我进入登录页面时,它试图记住我是谁。

谢谢

【问题讨论】:

您可以在已映射 url 和所需角色的位置发布代码。我猜你已经用一些必需的角色标记了登录 url。在登录页面上,您应该给出 permitAll 表达式。如果您无法弄清楚这一点,请使用安全管理器发送用于 url 映射的代码。 我已经编辑显示我没有使用登录页面 【参考方案1】:

我在 Tomcat 中遇到过这个问题(不确定是否只适用于它)。

从 Tomcat 文档 (see here) 我们可以得出结论,为会话 cookie 生成的路径有一个尾部斜杠:

某些浏览器,例如 IE,会发送一个会话 cookie 用于路径为 /foo 的上下文,并请求 /foobar。为了防止这种情况,Tomcat 将在与会话 cookie 关联的路径中添加一个斜杠,因此,在上面的示例中,cookie 路径变为 /foo/。但是,对于 /foo/ 的 cookie 路径,IE 将不再将带有请求的 cookie 发送到 /foo。除非有映射到 /* 的 servlet,否则这应该不是问题。在这种情况下,需要禁用此功能。此属性的默认值为 true。要禁用此功能,请将属性设置为 false。

另一方面,spring-security 的CookieClearingLogoutHandler 将生成一个不带斜杠的cookie 路径。 set-cookie 响应头将被发送到浏览器,但由于缺少尾部斜杠,cookie 路径将与路径不匹配。

浏览器不会清除现有的 JSESSIONID cookie,因为路径不匹配。

我解决了实现 CookieClearingLogoutHandler 的自定义实现的问题。

【讨论】:

哇,这是一个很好的答案。我也将尝试这样做。你介意发布一个自定义 cookieclearinglogouthandler 的 sn-p 让我了解你做了什么吗? public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) Cookie cookie = new Cookie("JSESSIONID", null); cookie.setPath(request.getContextPath() + "/"); cookie.setMaxAge(0); response.addCookie(cookie); 这已在 Spring Security 5.0 和 4.2 中修复:github.com/spring-projects/spring-security/issues/2325

以上是关于导航到 Spring Security 登录页面重定向到 invalid-session-url的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security 禁用登录页面/重定向

尽管我们不提供 Spring Security 配置,为啥 Spring Security 应用程序会重定向到登录页面?

使用 Spring Security 登录后重定向到不同的页面

Spring Security 3.1 - 发生会话超时时自动重定向到登录页面

Grails Spring Security - 登录后总是重定向到特定页面?

通过 JSF 表单成功登录后 Spring Security 不会重定向到登录页面