如何在Spring Boot中组合两个不同的配置文件



我具有多项目春季应用程序。项目A-负责LDAP身份验证项目B-负责数据库身份验证项目主项目 - 可以使用它们或其中之一。如果我们仅使用项目A-我们有LDAP auth如果我们仅使用项目B-我们有JDBC auth如果我们使用两者 - 首先使用LDAP auth,如果失败,则将进行JDBC auth。如果包括项目B,它添加了一些过滤器

项目main没有@configuration文件,但是项目A和B具有它。

项目@configuration

@Configuration
@EnableWebSecurity
@Order(1)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
/**адрес сервера LDAP*/
@Value("${ldap.server}")
private String ldapServer;
/**номер порта LDAP сервера*/
@Value("${ldap.port}")
private int ldapPort;
/**домен для LDAP*/
@Value("${ldap.suffix}")
private String suffix;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.authenticationProvider(adAuthProvider());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.httpBasic()
            .and()
            .authorizeRequests().antMatchers("/**").authenticated()
            .and()
            .csrf().disable();
}
/**провайдер для аутентификации через LDAP*/
@Bean
public ActiveDirectoryLdapAuthenticationProvider adAuthProvider() {
    String ldapUrl = String.format("ldap://%s:%s", ldapServer, ldapPort);
    ActiveDirectoryLdapAuthenticationProvider adAuthProvider = new 
  ActiveDirectoryLdapAuthenticationProvider(suffix, ldapUrl);
    adAuthProvider.setConvertSubErrorCodesToExceptions(true);
    adAuthProvider.setUseAuthenticationRequestCredentials(true);
    return adAuthProvider;
}
}

和项目B配置文件。

@Configuration
@EnableWebSecurity
public class ECommonConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.authenticationProvider(jdbcAuthProvider());    
}
@Override
protected void configure(HttpSecurity http) throws Exception {
 http.httpBasic()
            .and()
            .authorizeRequests().antMatchers("/**").authenticated()
            .and()
            .csrf().disable();
    http.addFilterAt(ldapAuthenticationFilter(), LDAPAuthenticationFilter.class);
    http.authorizeRequests().antMatchers("/**").access("@requestAuthorization.checkRequestPermissions(authentication, request)");
}
/**провайдер для аутентификации через базу данных*/
@Bean
public DaoAuthenticationProvider jdbcAuthProvider() {
    DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
    authProvider.setUserDetailsService(userDetailsService);
    authProvider.setPasswordEncoder(passwordEncoder());
    return authProvider;
}
/**бин для шифрования паролей*/
@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}
/**бин для фильтра проверки наличия LDAP-пользователя в базе данных*/
@Bean
public LDAPAuthenticationFilter ldapAuthenticationFilter() throws Exception {
    return new LDAPAuthenticationFilter(authenticationManager());
}
@Bean
@Override
protected AuthenticationManager authenticationManager() throws Exception {
    return super.authenticationManager();
}
/**бин для инициализации базы данных по умолчанию - описание параметров подключения к БД в файле application.yml*/
@Bean
public DataSource dataSource() {
    return datasourceConnectionManager().getDataSource("test");
}
/**бин создания менеджера подключения к нескольким базам данных*/
@Bean
public DatasourceConnectionManager datasourceConnectionManager() {
    return new DatasourceConnectionManager();
}
}

我需要这两种配置一起工作,或者只有一个oh oh

要结合这两种身份验证方法,您可以创建自定义身份验证提供商(更多详细信息:https://www.baeldung.com/spring-security-authentication-provider(P>

实施者的实现将看起来像这样:

@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {
    private ActiveDirectoryLdapAuthenticationProvider ldapAuthenticationProvider;
    private DaoAuthenticationProvider daoAuthenticationProvider;
    // env variable to help you choose which auth provider should be enabled
    @Value("${ldap.enabled}")
    private int ldapEnabled;
    // env variable to help you choose which auth provider should be enabled
    @Value("${daoAuth.enabled}")
    private int daoAuthEnabled;
    @Autowired
    public CustomAuthenticationProvider(ActiveDirectoryLdapAuthenticationProvider ldapAuthenticationProvider, DaoAuthenticationProvider daoAuthenticationProvider) {
        this.ldapAuthenticationProvider = ldapAuthenticationProvider;
        this.daoAuthenticationProvider = daoAuthenticationProvider;
    }
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        Assert.isInstanceOf(UsernamePasswordAuthenticationToken.class, authentication);
        // if both enabled then first try with ldap, if not successful try with dao
        if (ldapEnabled && daoAuthEnabled ) {
          Authentication authenticate = ldapAuthenticationManager.authenticate(authentication);
          if(!authenticate.isAuthenticated()) {
            authenticate = ldapAuthenticationManager.authenticate(authentication);
          }
          return authenticate;
        }
        // if only ldap enabled 
        if(ldapEnabled) {
          return ldapAuthenticationManager.authenticate(authentication);
        }
        // if only dao enabled
        return daoAuthenticationProvider.authenticate(authentication);
    }
    @Override
    public boolean supports(Class<?> authentication) {
        return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication);
    }
}

您可以使用弹簧分析。只需添加@profile注释以及配置类上的名称,如下所示。Projecta

的配置
@Profile("ProjectA")
@Configuration
@EnableWebSecurity
@Order(1)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
...

和projectb的配置

@Profile("ProjectB")
@Configuration
@EnableWebSecurity
public class ECommonConfig extends WebSecurityConfigurerAdapter {
...

然后,在执行应用程序时,您可以通过将以下参数传递给Java来指定活动配置文件。

#In case of need of only ProjectA then
-Dspring.profiles.active=ProjectA
#In case of need of only ProjectB then
-Dspring.profiles.active=ProjectB
#In case of need of both projects then
-Dspring.profiles.active=ProjectA,ProjectB

您可以在application.properties文件中定义具有所需配置文件

的内容。
spring.profiles.active=ProjectA,ProjectB

这样,您可以动态确定应该包括哪个项目配置。

相关内容

  • 没有找到相关文章

最新更新