Spring Security ComponentScan

时间:2018-11-05 19:12:17

标签: java spring spring-boot spring-security

我有一个Spring Boot应用程序,该应用程序使用具有弹簧安全性的角色授权。包括自定义过滤器在内的安全设置和配置都存储在单个程序包内的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 :(得分:1)

我假设您在主类上使用@SpringBootApplication批注,并且您的包结构应如下所示。

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

在这种情况下,您会自动在主机中添加以下注释。

  • @EnableAutoConfiguration:启用Spring Boot的自动配置机制
  • @ComponentScan:在应用程序所在的程序包上启用@Component扫描
  • @Configuration:允许在上下文中注册额外的bean或导入其他配置类

如您所见,使用这个注解,您实际上是在一个注解中添加了三个注解,其中包括了@ComponetScan。您可以在Spring docs上找到更多内容。

更新

如果需要从组件扫描中排除软件包,则可以使用excludeFilters选项。例如,如果要排除esspring软件包中的所有内容,则可以执行以下操作。

@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。希望它能起作用。