Spring Cloud Eureka Server + настраиваемая автоматически настраиваемая веб-безопасность

У меня возникла проблема с порядком фильтрации при использовании настраиваемой автоматически настраиваемой конфигурации веб-безопасности из другого проекта вместе с Spring Cloud Eureka Server. При использовании настраиваемой автоматически настраиваемой конфигурации веб-безопасности springSecurityFilterChain появляется после фильтра servletContainer, созданного EurekaServerConfiguration. Следовательно, доступ к панели управления Eureka защищен, но /eureka/* не применена цепочка фильтров Spring Security.

Если я использую автоматически настраиваемую веб-безопасность Spring Boot по умолчанию (т.е. свойства security.basic.*, порядок фильтров правильный.

Если я использую создание настраиваемой конфигурации веб-безопасности в том же проекте и другом классе конфигурации в качестве сервера обнаружения, порядок фильтров правильный. Если я аннотирую основной класс приложения с помощью @EnableWebSecurity или добавляю статический внутренний класс в основной класс приложения с помощью @EnableWebSecurity, я также получаю неправильный порядок фильтрации.

Что я неправильно предоставляю автоконфигурацию или что-то не хватает в деталях реализации конфигурации веб-безопасности?

Репозиторий с полными примерами: Примеры конфигурации Eureka Security

Настройка

модуль - моя автоконфигурация

@Configuration
@AutoConfigureBefore(SecurityAutoConfiguration.class)
@ConditionalOnClass(EnableWebSecurity.class)
public class CustomSecurityConfiguration {

    @Configuration
    @EnableWebSecurity
    public static class WebSecurity extends WebSecurityConfigurerAdapter {

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

        @Override
        protected void configure(HttpSecurity http) throws Exception {
           http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
        }
    }
}

Этот проект содержит папку META-INF с файлом spring.factories и соответствующим классом, добавленным под ключом EnableAutoConfiguration. Я подтвердил через -Ddebug, что класс является положительным совпадением.

модуль - сервер обнаружения

Я включаю указанный выше модуль как зависимость, а также spring-boot-starter-security.

@SpringBootApplication
@EnableEurekaServer
public class DiscoveryServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(DiscoveryServerApplication.class, args);
    }
}

Порядок фильтрации - Ожидаемый (при использовании базовой безопасности Spring Boot или настраиваемой безопасности в проекте сервера обнаружения)

Mapping filter: 'metricFilter' to: [/*]
Mapping filter: 'characterEncodingFilter' to: [/*]
Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
Mapping filter: 'springSecurityFilterChain' to: [/*]
Mapping filter: 'webRequestTraceFilter' to: [/*]
Mapping filter: 'servletContainer' to urls: [/eureka/*]
Mapping filter: 'applicationContextIdFilter' to: [/*]
Mapping servlet: 'dispatcherServlet' to [/]

Порядок фильтров - Результат (настраиваемая автоматически настраиваемая веб-безопасность)

Mapping filter: 'metricFilter' to: [/*]
Mapping filter: 'characterEncodingFilter' to: [/*]
Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
Mapping filter: 'webRequestTraceFilter' to: [/*]
Mapping filter: 'servletContainer' to urls: [/eureka/*]
Mapping filter: 'springSecurityFilterChain' to: [/*]
Mapping filter: 'applicationContextIdFilter' to: [/*]
Mapping servlet: 'dispatcherServlet' to [/]

person SteveO    schedule 03.07.2015    source источник


Ответы (1)


Проблема здесь в том, что когда вы используете аннотацию @EnableWebSecurity, она отключает автоматическую настройку безопасности, обеспечиваемую Spring Boot в SpringBootWebSecurityConfiguration (см. http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-security).

При использовании @EnableWebSecurity объект bean springSecurityFilterChain создается в WebSecurityConfiguration. Поскольку этот bean-компонент является простым Filter, у него нет Order. При использовании автоматической конфигурации, предоставляемой SpringBootWebSecurityConfiguration, bean-компонент springSecurityFilterChain упаковывается в FilterRegistrationBean с порядком, который вы можете указать в своих файлах конфигурации, или по умолчанию 0 (см. https://github.com/spring-projects/spring-boot/issues/1640 для получения более подробной информации).

При использовании Spring Boot он пытается получить порядок Filter перед подключением их к контейнеру. При использовании @EnableWebSecurity, поскольку bean-компонент springSecurityFilterChain не имеет порядка, он получит значение по умолчанию Ordered.LOWEST_PRECEDENCE в классе OrderComparator. Это то же значение bean-объекта jersey, определенного в EurekaServerConfiguration, который отвечает за вызовы префикса /eureka. На этапе начальной загрузки Eureka, bean-компонент jersey создается перед неупорядоченным springSecurityFilterChain и будет связан раньше в цепочке фильтров, таким образом отключая защиту для префикса /eureka.

Чтобы решить эту проблему, просто добавьте FilterRegistrationBean, оборачивающий bean-компонент springSecurityChain в свой класс Configuration, аннотированный @EnableWebSecurity:

    @Bean
@ConditionalOnBean(name = AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME)
public FilterRegistrationBean securityFilterChainRegistration(@Qualifier(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME) Filter securityFilter)
{
    FilterRegistrationBean registration = new FilterRegistrationBean(securityFilter);
    registration.setOrder(SecurityProperties.DEFAULT_FILTER_ORDER);
    registration.setName(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME);
    return registration;
}

Я установил здесь порядок по умолчанию 0, вы можете сделать его настраиваемым, как в SpringBootWebSecurityConfiguration. Это сделает bean-компонент springSecurityChain так, как если бы он был настроен автоматически.

person jebeaudet    schedule 07.10.2015