Наша команда разрабатывает веб-приложение с использованием Spring boot (2.2.2). Он использует Spring Security для обработки процесса входа в систему. Мы хотим, чтобы приложение перенаправляло обратно на страницу перед входом в систему (например, для доступа пользователя http://example.com/foo/bar -> если сеанс входа в систему истек, затем показать страницу входа в систему -> если вход выполнен успешно, то возвращается обратно к http://example.com/foo/bar)
Все выглядит нормально, за исключением того, что приложение иногда указывает на страницу по умолчанию (например, http://example.com) вместо страницы перед входом в систему. Когда это происходит, кажется, что страница до входа в систему не сохраняется в сеансе (в соответствии с тем, что сообщил мой товарищ по команде). Это связано с нашей конфигурационной проблемой?
Ниже приводится наш WebSecurityConfig
@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")
;
}
Так как successHandler не установлен в WebSecurityConfig, SavedRequestAwareAuthenticationSuccessHandler будет вызываться по умолчанию. Кажется, проблема возникает в следующей части метода onAuthenticationSuccess :
@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);
}
Время от времени saveRequest имеет значение NULL, поэтому Spring Security указывает на страницу по умолчанию (http://example.com) после успешного входа. В чем причина?