Безопасность Spring Boot 2 — токен с предварительной аутентификацией — разрешить проверку работоспособности

Моя проверка работоспособности 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();
}

Я считаю, что вам нужно переопределить метод WebSecurity и отключить всю безопасность на actuator API. Кроме того, вы можете использовать класс EndpointRequest для инкапсуляции ваших API-интерфейсов приводов.

Darren Forsythe 10.07.2019 12:49

Звучит хорошо, пожалуйста, покажите пример.

user9835597 10.07.2019 13:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
800
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуйте добавить .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».

user9835597 11.07.2019 07:23

Здравствуйте @Jandroid1, не могли бы вы обновить трассировку стека или полную ошибку и поделиться xyzTokenRequestHeaderAuthenticationFilter()

Romil Patel 11.07.2019 11:57

Проблема, похоже, связана с вашей 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 для проверки работоспособности.

Другие вопросы по теме