导航到 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 3.1 - 发生会话超时时自动重定向到登录页面