Spring Security перенаправляет на страницу с кодом состояния 999 - PullRequest
0 голосов
/ 04 апреля 2020

После успешного входа пружина перенаправляет на страницу /error со следующим содержанием

{
  "timestamp" : 1586002411175,
  "status" : 999,
  "error" : "None",
  "message" : "No message available"
}

Я использую spring-boot 2.2.4

Моя конфигурация:

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
spring.mvc.servlet.load-on-startup=1
spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false

@Configuration
public class DispatcherContextConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    }
}

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AppSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) {
        web.ignoring().antMatchers("/favicon.ico", "/resources/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .authorizeRequests()
                .antMatchers("/api/**").permitAll()
                .antMatchers("/registration/**").anonymous()
                .anyRequest().authenticated()
                .and()
                    .headers()
                        .defaultsDisabled()
                        .cacheControl()
                    .and()
                .and()
                    .exceptionHandling()
                        .accessDeniedPage("/errors/403")
                .and()
                    .formLogin()
                    .loginPage("/login")
                    .loginProcessingUrl("/login")
                    .failureUrl("/login?error")
                    .defaultSuccessUrl("/log") // I don't want to use force redirect here
                    .permitAll()
                .and()
                    .logout()
                    .logoutUrl("/logout")
                    .deleteCookies("JSESSIONID")
                    .invalidateHttpSession(true)
                    .logoutSuccessUrl("/login?logout")
                    .permitAll()
                .and()
                    .rememberMe()
                    .rememberMeParameter("remember-me")
                    .key("myKey");

    }

    // ...
}

Примечание:

Оказывается, что ошибка вызвана неудачным запросом к одному из моих статических c ресурсов. На странице входа есть <script src="/resources/my-js-file.js"></script>, которого нет в проекте. Я могу исправить это, удалив отсутствующий ресурс импорта, но проблема может появиться в будущем, поэтому это не исправление.

Как я могу предотвратить это?

Я знаю, что могу принудительно перенаправить на стартовая страница с .defaultSuccessUrl("/log", true) но я не хочу этого. Также я хочу, чтобы перенаправление работало должным образом, несмотря на отсутствие найденных ресурсов.

1 Ответ

1 голос
/ 04 апреля 2020

Потратив много времени, я выяснил, что происходит.

Так что Spring не может найти один из ресурсов stati c, который используется на странице входа. Но вместо возврата статуса 404 для этого ресурса он пытается отобразить страницу с ошибкой и перенаправляет запрос на /error. Тогда Spring Security отклоняет этот запрос, потому что пользователь не авторизован. Он сохраняет /error запрос в сеанс (для перенаправления после успешного входа в систему) и перенаправляет пользователя на страницу входа.

Конечно, пользователь не может видеть это перенаправление, потому что статус 302 возвращается для запроса, который выполняется в фоновом режиме. , Но основной проблемой является /error запрос, сохраненный в сеансе.

Затем пользователь успешно входит в систему и весной проверяет сеанс на наличие этого атрибута и выполняет перенаправление на страницу /error. По умолчанию spring предполагает, что у вас есть такая страница где-то в c ресурсах . Если у вас нет этой страницы, вы увидите странную ошибку с кодом состояния 999.

Решение 1

Игнорировать /error страницу в конфигурации безопасности:

web.ignoring().antMatchers("/favicon.ico", "/resources/**", "/error");

Таким образом, этот запрос не будет сохранен в сеансе для перенаправления пользователя после успешного входа в систему. Вы увидите, что на странице входа код состояния запроса к ресурсу stati c изменится с 302 на 404.

Решение 2

Игнорировать часть автоматической настройки весенней загрузки:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration

Это дает тот же результат, но отключает некоторые bean-компоненты из конфигурации ErrorMvcAutoConfiguration, поэтому будьте осторожны.

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