ОШИБКА "ERR_INVALID_REDIRECT" для входа в форму - PullRequest
0 голосов
/ 08 января 2019

Почему эта ошибка появляется при авторизации пользователя. Делал все по инструкции.

Не работает с HTTPS. В HTTP все нормально.

все отлично работает, кроме формы входа ....

@ EnableWebSecurity открытый класс ConfigSecurity расширяет WebSecurityConfigurerAdapter {

@Autowired private UserDetailsService userDetailsService;

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        //auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
        auth.userDetailsService(userDetailsService).passwordEncoder(NoOpPasswordEncoder.getInstance());
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
    .authorizeRequests()
        .antMatchers("/accaunt/company/**").hasRole("COMPANY")
        .antMatchers("/accaunt/resume/**").hasRole("WORKER")
        .antMatchers("/accaunt/**").authenticated()
        .anyRequest().permitAll()
    .and()
        /*
         *  установка второго параметра (alwaysUse) в false 
         *  говорит Spring Security что в случае успешной 
         *  авторизации можно перенаправить пользователя на 
         *  ту страничку, с которой он пришел на страницу аутентификации. 
         */
        .formLogin()
        .defaultSuccessUrl("/accaunt/main", true)
        .loginPage("/login")
        .permitAll()
    .and()
        .logout()
        .logoutSuccessUrl("/login")
        .permitAll()
    .and()
        .csrf().disable()
            .requiresChannel() //config request to use the mapping to a required channel
                .anyRequest().requiresSecure();

    //maps the port 8080(http) to 8443(https)
    http.portMapper().http(8080).mapsTo(8181); 

}

}

1 Ответ

0 голосов
/ 09 января 2019

На моей голове,

  1. контейнер сервлета не помечает запрос как безопасный и устанавливает HttpServletRequest.getScheme для возврата правильного значения
  2. Другой фильтр перехватывает запрос

Вы можете вставить фильтр в начале цепочки фильтров для проверки значения HttpServletRequest.getScheme при поступлении запроса. Это то, что Spring Security использует для оценки.

Если веб-контейнер (tomcat / jetty) неправильно настраивает схему в HttpServletRequest, то это проблема конфигурации контейнера.

Я создал несколько сэмплов, с которыми можно поиграть Я хочу, чтобы вы обратили особое внимание на тест , который может проходить в вашем случае

git clone https://github.com/fhanik/spring-security-community.git
cd spring-security-community
./gradlew :spring-security-community-samples-requires-secure-with-redirect:bootRun

Тесты в этом примере показывают рабочий пример и опускают зависимость от веб-сервера

Рабочая конфигурация может выглядеть следующим образом:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
    http
        //application security
        .authorizeRequests()
            .mvcMatchers("/non-secure/**").permitAll()
            .anyRequest().hasRole("USER")
            .and()
        .formLogin()
            .and()
        .requiresChannel().anyRequest().requiresSecure()
            .and()
        .portMapper().http(8080).mapsTo(8081)
    ;
    // @formatter:on
    }

}

Я также создал интеграционные тесты , которые проверяют эту конфигурацию.

...