Я работаю с веб-приложением, которое предоставляет 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()
Это не помогло.Не могли бы вы помочь с восстановлением исходного поведения?