我有登录成功并重定向到页面的奇怪问题。
下面是我的 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);
}
}
现在成功重定向到请求页面的问题。如果我直接引用任何安全网址,spring会将我重定向到登录页面,并在成功登录后重定向到原始请求的链接。
但是,如果用户之前选择了“记住我”,然后关闭浏览器并现在请求直接URL,则此方法不起作用,正在对他进行正确的身份验证,而不是将其重定向到请求的页面,而将 Spring 重定向到/。我检查了日志和一些spring源代码,发现它无法确定目标url。
我尝试设置参照,但参照值为null。但有一件奇怪的事我注意到,在 Spring 安全配置中,如果我从“记住我”配置中删除了身份验证成功处理程序,则它可以正常工作。
<remember-me key="jbcpHaverERP" authentication-success-handler-ref="loginSucessHandler"/>
无法找出问题。表单登录和“记住我”要求身份验证成功处理程序实现不同吗?
最佳答案
“记住我”与表单登录的不同之处在于,身份验证是在用户发出实际请求时进行的。对于表单登录,必须首先将用户重定向到登录页面,提交登录表单,然后将其重定向到原始目标(通常存储在 session 中)。因此,表单登录需要重定向,而“记住我”则不需要。使用“记住我”请求,可以对用户进行身份验证,并且可以在没有任何干预的情况下继续执行请求。AuthenticationSuccessHandler
的主要目的是控制身份验证后的导航流程,因此您通常根本不会将它与“记住我”一起使用。使用SavedRequestAwareAuthenticationSuccessHandler
并不是一个好主意,因为将没有可用的已保存请求。如果没有保存的请求,那么默认情况下,它将按照您观察到的那样执行重定向到“/”的操作。
如果只想在“记住我”登录期间添加一些功能,则可以直接实现AuthenticationSuccessHandler
接口(interface),而无需执行重定向或转发。如上所述,您不能对表单登录使用相同的实现,因为当前请求是提交登录表单(通常是提交给URL j_spring_security_check
),而不是提交给应用程序中的URL。因此,您需要重定向才能进行表单登录。