Пружина безопасности ComponentScan - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть приложение весенней загрузки, которое использует авторизацию ролей с помощью Spring Security. Настройка и настройка безопасности, включая настраиваемые фильтры, хранятся в модуле common в одном пакете. Чтобы использовать другие пакеты из модуля common в моем приложении, мне нужно использовать @ComponentScan и указать пакеты для сканирования, но если не включить пакет безопасности, кажется, что Spring все еще регистрирует его и реализует конфигурацию безопасности и фильтры. Это почему? Структура проекта:

module
    |common
    |   |src/main/java
    |   |   |com.company.product.common
    |   |   |   |redis
    |   |   |   |es
    |   |   |   |spring (the security configuration)
    |main_module
    |   |src/main/java
    |   |   |com.company.product.service
    |   |   |   |ServiceMainApp.java

Классы конфигурации:

package com.company.product.common.spring.configuration;

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private SecurityFilter securityFilter;

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.addFilterAfter(securityFilter, BasicAuthenticationFilter.class).csrf().disable();
    }
}

@Configuration
public class MethodSecurityConfiguration extends GlobalMethodSecurityConfiguration {

    @Value("${service.security.enabled:true}")
    private boolean securityEnabled;

    @Override
    protected MethodSecurityMetadataSource customMethodSecurityMetadataSource() {
        return securityEnabled ? new SecuredAnnotationSecurityMetadataSource() : null;
    }
}

Основной класс:

@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages = {"com.company.product.service", "com.company.product.common.redis"})
@EnableCaching
public class ServiceMainApp {
    public static void main(String[] args) {
        SpringApplication.run(ServiceMainApp.class, args);
    }
}

1 Ответ

0 голосов
/ 05 ноября 2018

Я предполагаю, что вы используете аннотацию @SpringBootApplication в своем основном классе, и ваша структура пакета должна выглядеть примерно так:

src/main/java/
    -> Main
        -> securitypackage
        -> all other packages

Если это так, вы автоматически добавляете следующие аннотации к своей основной.

  • @EnableAutoConfiguration: включить механизм автоконфигурации Spring Boot
  • @ComponentScan: включить @Component сканирование пакета, в котором находится приложение
  • @Configuration: разрешить регистрировать дополнительные компоненты в контексте или импортировать дополнительные классы конфигурации

Как видите, с помощью этой одной аннотации вы действительно добавляете три аннотации в одну, в которую входит @ComponetScan. Вы можете найти намного больше на Spring docs .

Обновление

Если вам нужно исключить пакеты из проверки вашего компонента, вы можете использовать опцию excludeFilters. Например, если вы хотите исключить все содержимое пакетов es и spring, вы можете сделать следующее.

@ComponentScan(basePackages = {"com.company.product.service", "com.company.product.common.redis"},
        excludeFilters = {
             @Filter(type = FilterType.REGEX, pattern="com.company.product.common.spring.*"),
             @Filter(type = FilterType.REGEX, pattern="com.company.product.common.es.*")})

Если @Filter не работает, попробуйте использовать @Component.Filter. Надеюсь, что это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...