我有一个弹簧配置文件" DEV"这就是我唯一的个人资料,我不想创建一个"生产"轮廓。所以只有当个人资料是" DEV"我想启动某种类型的bean用于Spring安全性(这是一个内存来宾用户和一个userdetails bean)
但是如果我的tomcat启动中没有提供spring配置文件(生产中就是这种情况),我希望我的应用程序继续它已经在做的事情(使用ldap authenticatin提供程序)。
有没有办法定义"默认"没有实际需要在启动时提供配置文件的bean行为?或者您可以查看下面的代码并提出不同的解决方案。
@Autowired
public void configureGlobal(final AuthenticationManagerBuilder auth, final AuthenticationProvider provider) throws Exception {
auth
.eraseCredentials(false)
.authenticationProvider(provider)
.authenticationProvider(jwtConfig.jwtAuthenticationProvider());
}
@Bean
public UserDetailsService userDetailsService() {
final LdapUserDetailsService ldapUserDetailsService = new LdapUserDetailsService(ldapUserSearch(), ldapAuthoritiesPopulator());
return new CompositeUserDetailsService(Arrays.asList(technicalUserDetailsService(), ldapUserDetailsService));
}
@Bean
@Profile("DEV")
public UserDetailsService devUserDetailsService() {
useAnonymous = true;
InMemoryUserDetailsManagerBuilder b = new InMemoryUserDetailsManagerBuilder()
.withUser("user").password("password").authorities(ROLE_USER, ROLE_ADMIN).and();
return new CompositeUserDetailsService(Arrays.asList(b.build(),
technicalUserDetailsService()));
}
@Bean
public AuthenticationProvider ldapAuthenticationProvider() {
final BindAuthenticator ba = new BindAuthenticator((BaseLdapPathContextSource) contextSource());
ba.setUserSearch(ldapUserSearch());
return new LdapAuthenticationProvider(ba, ldapAuthoritiesPopulator());
}
答案 0 :(得分:6)
我认为对@Profile
的作用存在误解。标记为@Profile
的Bean仅在该配置文件处于活动状态时加载,但所有其他bean(没有@Profile
)仍然始终加载,无论选择的配置文件如何。
我看到了解决这个问题的几种方法:
1)用@Profile("dev")
标记所有那些带有@Primary
的bean,这样Spring知道当加载两个相同类型的bean时要选择哪一个(因为你不想使用生产配置文件)
2)当使用@Profile("!dev")
激活配置文件时,标记应该不加载的bean - 仅适用于Spring 3.2及更高版本(请参阅https://github.com/spring-projects/spring-framework/commit/bcd44f3798ed06c0704d2a3564b8a9735e747e87)。< / p>
或者...
3)使用生产配置文件,然后在例如web.xml
文件(您可能不在本地使用的文件)中激活它。
只需创建多个@Configuration
类,并使用配置文件标记整个类(这也有助于将相关内容保存在一起)。典型的例子是数据库。为生产数据库(使用JNDI和Oracle)创建一个配置类,为本地开发和测试(HSQLDB)创建一个配置类。
您使用@Profile("production")
标记JNDI配置类,使用@Profile("dev")
标记另一个 - 不需要标记单个bean,只需在逻辑上将它们分成两个不同的@Configuration
类。
这对我们来说非常有用,当与集成测试结合使用时也是如此。
答案 1 :(得分:0)
我会以这种方式覆盖bean定义:
@Qualifier
以这种方式启动“DEV”配置文件时,该配置文件中定义的bean应覆盖默认bean
当您自动装配bean时,您应该使用contextPath
注释
我希望它有用
安吉洛