Spring Security иногда перенаправляет на страницу по умолчанию вместо страницы перед входом в систему после успешного входа - PullRequest
1 голос
/ 21 января 2020

Наша команда разрабатывает веб-приложение с использованием 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) после успешного входа. В чем причина?

1 Ответ

0 голосов
/ 24 января 2020

Перенаправление в контекст root вызвано из-за sessionManagement().invalidSessionUrl("/loginForm").

Это потому, что вы делаете явный вызов страницы входа в систему, и, следовательно, она обрабатывается как запрошенная страница, а не как перенаправление для аутентификации. После аутентификации spring будет перенаправлять на URL-адрес по умолчанию (по умолчанию это контекст root, если он не переопределен в конфигурации).

На мой взгляд, это должно происходить всегда, а не случайно.

Пожалуйста, удалите упомянутую конфигурацию и дайте пружине обработать перенаправление для аутентификации. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...