Как отключить безопасность привода, не отключая его полностью с помощью Spring Boot 2 - PullRequest
0 голосов
/ 02 сентября 2018

Я использую Spring Boot Security с OAuth2. Я не хочу отключать безопасность для конечной точки здоровья.

Я могу полностью отключить безопасность или написать собственную реализацию WebSecurityConfigurerAdapter и отключить автоконфигурированную.

Но как изменить существующую реализацию WebSecurityConfigurerAdapter (OAuth2SsoDefaultConfiguration)?

Я пытался создать свою собственную конфигурацию, не отключая ее, но это невозможно из-за конфликтов Order.

Вот сообщение об ошибке:

Caused by: java.lang.IllegalStateException: @Order on WebSecurityConfigurers must be unique. 
Order of 100 was already used on SecurityConfiguration$$EnhancerBySpringCGLIB$$9505fc58@13f182b9,
 so it cannot be used on 
org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2SsoDefaultConfiguration$$EnhancerBySpringCGLIB$$dc290e2b@5ee0cf64 too.

Кроме того, я попытался явно установить более высокий порядок для своей собственной конфигурации безопасности, но похоже, что автоматически настроенный один переопределяет мой.

Так как же переопределить определенные правила безопасности без переопределения всей конфигурации?

Ответы [ 4 ]

0 голосов
/ 02 сентября 2018
@Configuration
@EnableOAuth2Sso
class MyConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/actuator/health")
                .permitAll()
            .anyRequest()
                .authenticated();
    }

}

Убедитесь, что вы используете @EnableOAuth2Sso в классе WebSecurityConfigurerAdapter. Это важно, потому что он будет включать OAuth2SsoCustomConfiguration, который в основном копирует функциональность OAuth2SsoDefaultConfiguration#configure.

Вы также можете показать полную информацию о состоянии здоровья:

management:
  endpoint:
    health:
      show-details: always
0 голосов
/ 02 сентября 2018

Ниже приведены возможные проверки.

Решение 1 : Убедитесь, что вы используете

org.springframework.core.annotation.Order

вместо

org.apache.logging.log4j.core.config.Order

Поскольку Spring не анализировал правильные аннотации, он принимал значение по умолчанию 100 для обеих конфигураций.

Решение 2 :

Возможно, вы аннотировали другой класс аннотацией @EnableWebSecurity. Помните, что только один класс может реализовать эту аннотацию.

Решение 3 : См. Это https://stackoverflow.com/a/44076087/6572971

Решение 4:

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
public class DemoConfigurer extends WebSecurityConfigurerAdapter {
    @Override
    public void configure(HttpSecurity http) throws Exception{
        http.authorizeRequests().antMatchers("/health").permitAll();
        super.configure(http);
    }
}
0 голосов
/ 02 сентября 2018

Вам необходимо реализовать следующий метод в вашем

@SpringBootApplication класс

 @SpringBootApplication
 @EnableResourceServer
 @EnableGlobalMethodSecurity(prePostEnabled = true)
 @Configuration
 public class BusinessLogicServiceApplication extends ResourceServerConfigurerAdapter {

 public static void main(String[] args) throws IOException {
    ConfigurableApplicationContext context =  
    SpringApplication.run(BusinessLogicServiceApplication.class, args);
    }

  @Override
  public void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/health").permitAll().anyRequest().authenticated();

    }
}
0 голосов
/ 02 сентября 2018

Я думаю, вы могли бы иметь собственную реализацию, расширяющую используемую вами (OAuth2SsoDefaultConfiguration, если я правильно понял), а затем расширить метод configure, чтобы игнорировать вашу конечную точку работоспособности. Это будет выглядеть примерно так

@Override
public void configure(final HttpSecurity http) throws Exception {
    http.regexMatchers("/health",)
        .permitAll()
}

Кстати об этом Also, I tried to explicitly set higher order for my own security configuration, but looks like autoconfigured one overrides mine. Как работает @Order, меньшие числа имеют более высокий приоритет, поэтому это объяснило бы, почему автоконфигурированный переопределял ваш. Док здесь: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/annotation/Order.html

...