Spring Security .permitAll () больше не действует после обновления до Spring Boot 2.0.2 - PullRequest
0 голосов
/ 11 июня 2018

Я работаю с веб-приложением, которое предоставляет REST API для мобильных приложений.Я обновил версию Spring Boot с 1.5.3.RELEASE до 2.0.2.RELEASE, и после исправления нескольких критических изменений я столкнулся с проблемой, которую не могу решить.

Я следовал за этим Spring Boot 2.0 MigrationРуководство и Spring Boot Security 2.0 , а также изучено Изменения безопасности в Spring Boot 2.0 M4 .

Проблема заключается в том, что приложение использует аутентификацию JWT иявляется конечной точкой (/ auth / login), принимает учетные данные пользователя и генерирует долгоживущий JWT в ответ.

Существует фильтр, который проверяет токен JWT, отправленный клиентом, и определяет, может ли клиент получить доступ к запрошенномуресурс.

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

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled=true)
public class SecurityConfiguration {

@Configuration
@Order(1)
public class AuthenticationConfiguration extends WebSecurityConfigurerAdapter {

    // Some dependencies omitted

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                // we don't need CSRF because JWT token is invulnerable
                .csrf().disable()

                .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()

                // don't create session
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()

                .authorizeRequests()
                .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
                .antMatchers(HttpMethod.GET, "/version/**").permitAll()
                // Some more antMatchers() lines omitted
                .antMatchers("/auth/**").permitAll()
                .anyRequest().authenticated();

        // Custom JWT based security filter
        httpSecurity
                .addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class);

        // disable page caching
        httpSecurity.headers().cacheControl();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public JwtAuthenticationTokenFilter authenticationTokenFilterBean() throws Exception {
        return new JwtAuthenticationTokenFilter(jwtTokenUtil);
    }
}

@Configuration
@Order(2)
public class ClientVersionSupportConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry
                .addInterceptor(versionCheckingFilter())
                .addPathPatterns("/**")
                .excludePathPatterns("/error"); // Some more endpoints omitted
    }

    @Bean
    public VersionCheckingInterceptor versionCheckingFilter() {
        return new VersionCheckingInterceptor();
    }
}

}

Обратите внимание на строку .antMatchers("/auth/**").permitAll()./auth конечные точки должны быть доступны без JWT, так как JWT еще не был сгенерирован, когда пользователь еще не вошел в систему.

До обновления Spring Boot он работал нормально, теперь он не работает.Попытки входа в систему отклоняются фильтром, который проверяет JWT.Похоже, .permitAll() не заставляет запросы проходить./version/** тоже не работает.Удар по нему из браузера выдает страницу ошибки.

Я также пытался удалить строки из конфига, пока это не осталось:

httpSecurity
        .authorizeRequests()
                .antMatchers("/auth/**").permitAll()

Это не помогло.Не могли бы вы помочь с восстановлением исходного поведения?

1 Ответ

0 голосов
/ 13 июня 2018

У вас есть базовый путь для вашего API, например, /api?

Имя свойства Spring по умолчанию server.contextPath изменено на server.servlet.context-path.

Так что если вы используете базовый путь по умолчанию для вашего API, вы не найдете конечные точки там, где вы ожидаете их.Если вы не обновите свойство;)

...