gpt4 book ai didi

spring - 记住我和身份验证成功处理程序

转载 作者:IT老高 更新时间:2023-10-28 13:44:57 27 4
gpt4 key购买 nike

我有登录成功和重定向到页面的奇怪问题。

下面是我的 spring 安全配置。

<http auto-config="true" use-expressions="true">
<intercept-url pattern="/login.hst**" access="anonymous or authenticated" />
<intercept-url pattern="/**/*.hst" access="authenticated" />
<form-login login-page="/login.hst"
authentication-failure-url="/login.hst?error=true"
authentication-success-handler-ref="loginSucessHandler" />
<logout invalidate-session="true" logout-success-url="/home.hst"
logout-url="/logout.hst" />
<remember-me key="jbcpHaverERP" authentication-success-handler-ref="loginSucessHandler"/>
<session-management>
<concurrency-control max-sessions="1" />
</session-management>
</http>

LoginSuessHandler 类:

@Service
public class LoginSucessHandler extends
SavedRequestAwareAuthenticationSuccessHandler {

@Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response, Authentication authentication)
throws ServletException, IOException {
...
super.setUseReferer(true);
super.onAuthenticationSuccess(request, response, authentication);
}

}

现在成功重定向到请求页面的问题。如果我直接引用任何安全 url,spring 会将我重定向到登录页面并成功登录到原始请求的链接。但是,如果用户之前选择了记住我,然后关闭浏览器并现在请求直接 URL,则这不起作用,他正在正确地进行身份验证,而不是将他重定向到请求的页面 Spring 重定向到/。我检查了日志和一些 spring 源代码,发现它无法确定目标 url。

我已尝试设置refer,但referer 值为空。但是我注意到一件奇怪的事情,在 spring 安全配置中,如果我从 remember-me 配置中删除 authentication-success-handler ,那么它就可以工作。

    <remember-me key="jbcpHaverERP" authentication-success-handler-ref="loginSucessHandler"/>

无法找出问题。表单登录和记住我的身份验证成功处理程序实现是否需要不同?

最佳答案

Remember-me 与 form-login 的不同之处在于身份验证发生在用户发出的实际请求期间。对于表单登录,用户必须首先被重定向到登录页面,提交登录表单,然后他们被重定向到原始目标(通常缓存在 session 中)。所以 form-login 需要重定向,而 remember-me 不需要。使用记住我的请求,可以对用户进行身份验证,并允许请求继续进行而无需任何干预。

AuthenticationSuccessHandler 的主要目的是控制身份验证后的导航流程,因此您通常根本不会将其与 remember-me 一起使用。使用 SavedRequestAwareAuthenticationSuccessHandler 不是一个好主意,因为没有可用的已保存请求。如果没有保存的请求,那么默认情况下它将执行重定向到“/”,正如您所观察到的那样。

如果您只想在记住我登录期间添加一些功能,那么您可以直接实现 AuthenticationSuccessHandler 接口(interface),而无需执行重定向或转发。正如我上面解释的,你不能对 form-login 使用相同的实现,因为当前请求是提交登录表单(通常是到 URL j_spring_security_check),而不是对应用程序中的 URL。所以你需要一个重定向表单登录。

关于spring - 记住我和身份验证成功处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11575860/

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