Отдельный поставщик аутентификации в Spring Boot 2 для Actuator и пользовательских конечных точек API - PullRequest
0 голосов
/ 04 февраля 2020

У нас есть приложение с начальной загрузкой (версия с начальной загрузкой 2.1.4), которое предоставляет API отдыха, защищенный с помощью OAuth2. Нам также необходимо предоставить конечные точки проверки работоспособности (Actuator), предоставляемые Spring Boot, устаревшему инструменту мониторинга, который поддерживает только базовую аутентификацию c. Однако, начиная с Spring Boot 2, Actuator разделяет конфигурацию безопасности с обычными правилами безопасности приложения, поэтому единственные варианты, которые я вижу до сих пор, - это защитить его с помощью Oauth2 или оставить его незащищенным (.permitAll()).

Я пытаюсь использовать отдельные WebSecurityConfigurerAdapter (s) для настройки провайдера аутентификации httpBasi c для конечных точек привода и oauth2 для конечных точек API, играя с исполнением @Order, но оба провайдера аутентификации кажутся взаимоисключающими .

Добавьте две реализации WebSecurityConfigurerAdapter:

  1. Для привода:
@Configuration
@Order(1)
public class ActuatorConfigurationAdapter extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("admin").password("password")
                .roles("ADMIN", "USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
//                requestMatchers(EndpointRequest.to(MetricsEndpoint.class))
        .antMatchers("/actuator/**")
                .hasAnyRole("ADMIN","USER").and().authorizeRequests().and().httpBasic();
    }
}
Для API:
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
@Order(10)
public class SecurityConfiguration2 extends WebSecurityConfigurerAdapter {
    @Autowired
    private CorsFilter corsFilter;

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .cors()
        .and()
            .addFilterBefore(corsFilter, CsrfFilter.class)
            .exceptionHandling()
            .authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED))
        .and()
            .headers()
        .and()
            .authorizeRequests()
            .antMatchers("/v2/api-docs").permitAll()
            .antMatchers("/authenticate").permitAll()
            .antMatchers("/customer/**").hasAuthority("MARKETING")
            .anyRequest().authenticated()
        .and()
            .oauth2Login() // generates the /login page
            .successHandler(successHandler())
            ...
    }

Любые советы, как я могу сделать эту работу высоко ценится.

1 Ответ

1 голос
/ 04 февраля 2020

у меня такой же сценарий использования, и это работает для меня:

@EnableWebSecurity()
@EnableGlobalMethodSecurity(
    securedEnabled = true,
    prePostEnabled = true
)
public class WebSecurityConfig {


   @Configuration
   @Order(3)
   public static class ActuatorSecurityAdapter extends WebSecurityConfigurerAdapter {

   @Autowired
   private AppProperties prop;

   @Override
   protected void configure(HttpSecurity http) throws Exception {
    http
        .requestMatcher(EndpointRequest.toAnyEndpoint())
        .authorizeRequests()
        .requestMatchers(EndpointRequest.to("info","env")).authenticated()
        .requestMatchers(EndpointRequest.to("health")).permitAll()
        .anyRequest().hasRole("ADMIN") // Any other endpoint
        .and()
        .httpBasic();
  }

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

  @Bean
  @Override
  public UserDetailsService userDetailsService() {
    InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
    manager.createUser(User.withUsername(prop.getManagement().getUsername())
     .password(prop.getManagement().getPassword()).roles("ACTUATOR").build());
    return manager;
    }
  }


  [....]

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

  [...]
}

возможно, это поможет:)

...