Моя проверка работоспособности Spring Boot Actuator заблокирована из-за отсутствия токена (pre_authenticated).
Есть много доступных ответов, НО этот вопрос имеет влияние на безопасность с предварительной аутентификацией. Насколько я искал, это НЕ дубликат.
Как я могу разрешить проверку работоспособности в среде безопасности с предварительной аутентификацией?
Мой вопрос также в том, нужны ли мне дополнительные настройки (например, в application.properties)?
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private static final Logger logger = LoggerFactory.getLogger(SecurityConfig.class);
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) {
PreAuthenticatedAuthenticationProvider provider = new PreAuthenticatedAuthenticationProvider();
provider.setPreAuthenticatedUserDetailsService(new XyzPreAuthenticatedGrantedAuthoritiesUserDetailsService());
auth.authenticationProvider(provider);
}
// Try-1, see below
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilterBefore(xyzTokenRequestHeaderAuthenticationFilter(), RequestHeaderAuthenticationFilter.class)
.csrf().disable()
.authorizeRequests()
.antMatchers("/actuator/**").permitAll()
.anyRequest().authenticated();
}
@Bean
public XyzTokenRequestHeaderAuthenticationFilter xyzTokenRequestHeaderAuthenticationFilter() throws Exception {
XyzTokenRequestHeaderAuthenticationFilter filter = new XyzTokenRequestHeaderAuthenticationFilter();
filter.setAuthenticationManager(authenticationManager());
return filter;
}
}
Моя вторая попытка была:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilterBefore(xyzTokenRequestHeaderAuthenticationFilter(), RequestHeaderAuthenticationFilter.class)
.csrf().disable()
.authorizeRequests()
.antMatchers("/actuator/**").permitAll();
}
Звучит хорошо, пожалуйста, покажите пример.




Попробуйте добавить .ignoring() и добавить @EnableGlobalMethodSecurity(prePostEnabled = true), @Configuration на уроке
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter implements WebMvcConfigurer{
@Override
public void configure(WebSecurity web) throws Exception {
web
.ignoring()
.antMatchers("/actuator/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/actuator/**").permitAll()
.anyRequest().authenticated()
.and()
.addFilterBefore(xyzTokenRequestHeaderAuthenticationFilter(), RequestHeaderAuthenticationFilter.class);
}
}
Спасибо за это решение. Увы, по-прежнему существует ошибка «Отсутствует токен Xyz».
Здравствуйте @Jandroid1, не могли бы вы обновить трассировку стека или полную ошибку и поделиться xyzTokenRequestHeaderAuthenticationFilter()
Проблема, похоже, связана с вашей XyzTokenRequestHeaderAuthenticationFilter реализацией. Если вы написали это, расширив RequestHeaderAuthenticationFilter, то вы должны установить свойство exceptionIfHeaderMissing в false.
Если вы не расширили этот базовый класс предварительной аутентификации Spring Security, вам нужно показать реализацию.
Похоже, что фильтр xyz не реализован «идеальным» способом.
Этот способ поможет вам заставить все работать:
1 - использовать порт управления:
management.server.port=8081
management.security.enabled=false
management.server.address=127.0.0.1
management.server.ssl.enabled=false
management.endpoints.health.sensitive=false
management.endpoint.health.show-details=always
2 - настроить оба пути веб и API. Используйте это помимо стандартных деталей:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement().sessionCreationPolicy(STATELESS);
http.csrf().disable();
http.authorizeRequests()
.antMatchers("/actuator/**").permitAll()
.antMatchers("/**").authenticated();
http.addFilterBefore(xyzTokenRequestHeaderAuthenticationFilter(), AbstractPreAuthenticatedProcessingFilter.class);
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/actuator/**");
}
3. Внутри контейнера Docker используйте порт 8081 для проверки работоспособности.
Я считаю, что вам нужно переопределить метод
WebSecurityи отключить всю безопасность наactuatorAPI. Кроме того, вы можете использовать классEndpointRequestдля инкапсуляции ваших API-интерфейсов приводов.