我有一个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);
}
}
答案 0 :(得分:1)
我假设您在主类上使用@SpringBootApplication
批注,并且您的包结构应如下所示。
src/main/java/
-> Main
-> securitypackage
-> all other packages
在这种情况下,您会自动在主机中添加以下注释。
@EnableAutoConfiguration
:启用Spring Boot的自动配置机制@ComponentScan
:在应用程序所在的程序包上启用@Component
扫描@Configuration
:允许在上下文中注册额外的bean或导入其他配置类如您所见,使用这个注解,您实际上是在一个注解中添加了三个注解,其中包括了@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
。希望它能起作用。