Java 成功登录后,Spring security偶尔会重定向到默认页面,而不是预登录页面
我们的团队正在使用SpringBoot(2.2.2)开发一个web应用程序。它使用Spring安全性来处理登录过程。我们希望应用程序在登录前重定向回页面(例如,用户访问->如果登录会话已过期,则显示登录页面->如果登录成功,则返回到) 除了应用程序偶尔指向默认页面(例如,)而不是登录前的页面之外,一切似乎都很好。发生这种情况时,登录前的页面似乎没有保存在会话中(根据我的队友的报告)。这是因为我们的配置问题吗 以下是我们的网站安全配置Java 成功登录后,Spring security偶尔会重定向到默认页面,而不是预登录页面,java,spring,spring-boot,spring-security,Java,Spring,Spring Boot,Spring Security,我们的团队正在使用SpringBoot(2.2.2)开发一个web应用程序。它使用Spring安全性来处理登录过程。我们希望应用程序在登录前重定向回页面(例如,用户访问->如果登录会话已过期,则显示登录页面->如果登录成功,则返回到) 除了应用程序偶尔指向默认页面(例如,)而不是登录前的页面之外,一切似乎都很好。发生这种情况时,登录前的页面似乎没有保存在会话中(根据我的队友的报告)。这是因为我们的配置问题吗 以下是我们的网站安全配置 @Override public void confi
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("...")
.anyRequest().authenticated()
.and()
.csrf().ignoringAntMatchers("...")
.and()
.formLogin()
.loginPage("/loginForm")
.loginProcessingUrl("/login")
.usernameParameter("userId")
.passwordParameter("password")
.failureUrl("/loginForm?error=true")
.permitAll()
.and()
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessHandler(logoutSuccessHandler())
.deleteCookies("JSESSIONID")
.invalidateHttpSession(true)
.permitAll()
.and()
.exceptionHandling()
.accessDeniedHandler(new CustomAccessDeniedHandler())
.and()
.sessionManagement()
.invalidSessionUrl("/loginForm")
;
}
由于未在WebSecurityConfig中设置successHandler,因此默认情况下将调用SavedRequestAwareAuthenticationSuccessHandler。问题似乎出现在AuthenticationSuccess方法的以下部分中:
@Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response, Authentication authentication)
throws ServletException, IOException {
SavedRequest savedRequest = requestCache.getRequest(request, response);
if (savedRequest == null) {
super.onAuthenticationSuccess(request, response, authentication);
return;
}
String targetUrlParameter = getTargetUrlParameter();
if (isAlwaysUseDefaultTargetUrl()
|| (targetUrlParameter != null && StringUtils.hasText(request
.getParameter(targetUrlParameter)))) {
requestCache.removeRequest(request, response);
super.onAuthenticationSuccess(request, response, authentication);
return;
}
clearAuthenticationAttributes(request);
// Use the DefaultSavedRequest URL
String targetUrl = savedRequest.getRedirectUrl();
logger.debug("Redirecting to DefaultSavedRequest Url: " + targetUrl);
getRedirectStrategy().sendRedirect(request, response, targetUrl);
}
有时savedRequest为null,因此Spring安全性会在成功登录后指向默认页面()。原因是什么?重定向到上下文根目录是由于
sessionManagement().invalidSessionUrl(“/loginForm”)
引起的
这是因为您正在对登录页面进行显式调用,因此它被视为请求的页面,而不是用于身份验证的重定向。在进行身份验证之后,spring将重定向到默认url(默认情况下是上下文根,除非在配置中被重写)
在我看来,这种情况应该经常发生,而不是偶尔发生
请删除上述配置,并让spring处理身份验证的重新定向。:) 重定向到上下文根目录是由于
sessionManagement().invalidSessionUrl(“/loginForm”)
引起的
这是因为您正在对登录页面进行显式调用,因此它被视为请求的页面,而不是用于身份验证的重定向。在进行身份验证之后,spring将重定向到默认url(默认情况下是上下文根,除非在配置中被重写)
在我看来,这种情况应该经常发生,而不是偶尔发生
请删除上述配置,并让spring处理身份验证的重新定向。:) 您是否为登录提供了任何成功处理程序?使用
SavedRequestAwareAuthenticationSuccessHandler
可能有助于实现您的目标:@Dvalshevale由于未在WebSecurity配置中设置successHandler(),因此将调用默认的SavedRequestAwareAuthenticationSuccessHandler,不是吗?我已经编辑了我的问题,非常感谢任何进一步的建议:)如果未指定成功处理程序,则默认情况下将调用我的坏,SavedRequestAwareAuthenticationSuccessHandler
。偶尔的重定向是由于sessionManagement().invalidSessionUrl(“/loginForm”)
引起的。这是因为您正在对登录页面进行显式调用,而不是让spring处理重新身份验证。在我看来,这种情况应该经常发生,而不是偶尔发生。@DhavalShewale谢谢你的建议!:D我注释掉了sessionManagement().invalidSessionUrl(“/loginForm”)
部分,它似乎按预期运行(总是在登录前直接返回页面)。很好:)将发布它作为结束问题的答案:)您是否提供了登录成功处理程序?使用SavedRequestAwareAuthenticationSuccessHandler
可能有助于实现您的目标:@Dvalshevale由于未在WebSecurity配置中设置successHandler(),因此将调用默认的SavedRequestAwareAuthenticationSuccessHandler,不是吗?我已经编辑了我的问题,非常感谢任何进一步的建议:)如果未指定成功处理程序,则默认情况下将调用我的坏,SavedRequestAwareAuthenticationSuccessHandler
。偶尔的重定向是由于sessionManagement().invalidSessionUrl(“/loginForm”)
引起的。这是因为您正在对登录页面进行显式调用,而不是让spring处理重新身份验证。在我看来,这种情况应该经常发生,而不是偶尔发生。@DhavalShewale谢谢你的建议!:D我注释掉了sessionManagement().invalidSessionUrl(“/loginForm”)
部分,它似乎按预期运行(总是在登录前直接返回页面)。太好了:)将发布它作为结束问题的答案:)