gpt4 book ai didi

java - session 过期时尝试注销导致登录后重定向到登录页面

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:33:57 30 4
gpt4 key购买 nike

如果标题不够清晰,请见谅。这是详细信息。

背景

我正在开发基于 Spring 的应用程序,该应用程序使用 Spring 3.1.1 和 Spring security 3.1.0。这是我们描述符的相关片段:

<security:http auto-config='true'>      
<security:intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<security:intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<security:intercept-url pattern="/**" access="ROLE_USER" />
<security:form-login login-page='/login' authentication-failure-url="/login?authfailed=true"/>
</security:http>

网页上的“注销”链接是指类似ROOT-URL/j_spring_security_logout 的URL。因此,单击此 URL 会将我们带到登录页面 (login.jsp) 并可以再次成功登录。

问题

如果用户登录到应用程序,等待 session 过期,然后尝试注销,他会到达登录页面。这可以。然后他输入正确的凭据并单击登录按钮。 现在他被重定向到相同的登录页面,其中用户名和密码字段为空,而不是进入应用程序。第二次登录尝试成功。

重要:只有当用户之前登录过, session 过期并且他试图注销时才会发生这种情况。例如,如果用户在 session 过期后单击任何其他链接,则不会发生这种情况。在这种情况下,他被重定向到登录页面,并且可以从第一次尝试成功登录。

分析

我的调查显示如下。由于 SavedRequestAwareAuthenticationSuccessHandler.onAuthenticationSuccess() 引起的 HTTP 重定向,我们两次到达登录页面,这是因为 requestCache 包含对登录页面的请求。 requestCacheHttpSessionRequestCache 类型的变量,它在 session 属性 "SPRING_SECURITY_SAVED_REQUEST" 中存储“缓存”请求。

在正常情况下,此缓存用于重定向到未经身份验证的用户在身份验证后请求的页面。

但在我们的案例中会发生这种情况。用户登录。那么他的 session 就过期了。然后他单击链接注销。由于 session 已过期,用户将被重定向到“j_spring_security_logout”,这会将他重定向到登录页面。

在这种情况下,登录 URL 被缓存为“请求”,因此当用户登录时,他将被重定向到请求的 URL,即登录页面。当重定向发生时,缓存的 URL 被删除,因此不会发生无限循环;第二次尝试登录成功。

相关代码引用如下:

ExceptionTranslationFilter.handleSpringSecurityException()调用 sendStartAuthentication()(第 168 行)

执行以下操作(第 183-184 行):

    SecurityContextHolder.getContext().setAuthentication(null);
requestCache.saveRequest(request, response);

但是此时请求的URL是登录页面。因此,登录页面被缓存。

看起来 saveRequest() 不应该在此时调用,例如这闻起来像是 Spring 框架中的错误...

我有这个问题的解决方案,我会在这里发布。但我的解决方案看起来像是我的补丁,所以我希望有人知道“正确”的解决方案。

提前致谢。

最佳答案

<intercept-url pattern="/login.jsp*" access="permitAll" />
<intercept-url pattern="/login*" access="permitAll" />

没有理由对登录页面本身施加任何限制。

关于java - session 过期时尝试注销导致登录后重定向到登录页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10431173/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com