Spring security 在spring boot security中使用authenticationProvider时如何配置数据源?

Spring security 在spring boot security中使用authenticationProvider时如何配置数据源?,spring-security,Spring Security,如果我使用的是jdbcAuthentication,那么它将是auth.jdbccAuthentication().dataSource(dataSource) 现在我有两个数据库,一个用于应用程序,一个用于安全 我找不到使用authenticationProvider()配置要使用的数据库的方法 我是如何解决这个问题的 @Configuration @EnableJpaRepositories(basePackages={"${spring.data.jpa.security.rep

如果我使用的是jdbcAuthentication,那么它将是auth.jdbccAuthentication().dataSource(dataSource)

现在我有两个数据库,一个用于应用程序,一个用于安全

我找不到使用authenticationProvider()配置要使用的数据库的方法

我是如何解决这个问题的

@Configuration
@EnableJpaRepositories(basePackages={"${spring.data.jpa.security.repository.packages}"}, 
                       entityManagerFactoryRef = "securityEntityManagerFactory")
public class DemoSecurityDataSourceConfig {

    @Bean
    @ConfigurationProperties(prefix="security.datasource")
    public DataSource securityDataSource() {
        return DataSourceBuilder.create().build();
    }
    
    @Bean
    @ConfigurationProperties(prefix="spring.data.jpa.security")
    public LocalContainerEntityManagerFactoryBean securityEntityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("securityDataSource") DataSource securityDataSource) {
        return builder
                .dataSource(securityDataSource)
                .build();
    }   
}

您可以通过编程方式配置
数据源
,然后使用
JdbcUserDetailsManager
配置Spring Security应该使用哪个数据源

在下面的示例中,有2个
数据源,一个使用H2,一个使用MySQL

Spring Security使用H2
数据源
,因为我们添加了“Security”
@限定符

@Bean(“安全性”)
公共数据源安全性数据源(){
返回新的EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScript(“classpath:org/springframework/security/core/userdetails/jdbc/users.ddl”)
.build();
}
@豆子
@初级的
公共数据源primaryDataSource(){
DataSourceBuilder DataSourceBuilder=DataSourceBuilder.create();
dataSourceBuilder.url(“jdbc:mysql://localhost:3306/db_example");
dataSourceBuilder.username(“springuser”);
dataSourceBuilder.password(“密码”);
返回dataSourceBuilder.build();
}
@豆子
UserDetailsManager用户(@Qualifier(“security”)数据源数据源){
UserDetails user=user.builder()
.用户名(“用户”)
.password(“{bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW”)
.角色(“用户”)
.build();
JdbcUserDetailsManager用户=新的JdbcUserDetailsManager(数据源);
users.createUser(用户);
返回用户;
}

我可以通过创建两个数据源各自的cofig文件并添加entityManagerFactoryRef和basePackages来分离这两个数据源,这样应用程序就可以知道在访问某个实体时要获取信息的数据库。
@Configuration
@EnableJpaRepositories(basePackages={"${spring.data.jpa.security.repository.packages}"}, 
                       entityManagerFactoryRef = "securityEntityManagerFactory")
public class DemoSecurityDataSourceConfig {

    @Bean
    @ConfigurationProperties(prefix="security.datasource")
    public DataSource securityDataSource() {
        return DataSourceBuilder.create().build();
    }
    
    @Bean
    @ConfigurationProperties(prefix="spring.data.jpa.security")
    public LocalContainerEntityManagerFactoryBean securityEntityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("securityDataSource") DataSource securityDataSource) {
        return builder
                .dataSource(securityDataSource)
                .build();
    }   
}
@Configuration
@EnableJpaRepositories(basePackages={"${spring.data.jpa.app.repository.packages}"},
                       entityManagerFactoryRef = "appEntityManagerFactory")
public class DemoAppDataSourceConfig {
    
    @Primary
    @Bean
    @ConfigurationProperties(prefix="app.datasource")
    public DataSource appDataSource() {
        return DataSourceBuilder.create().build();
    }
    
    @Primary
    @Bean
    @ConfigurationProperties(prefix="spring.data.jpa.app")
    public LocalContainerEntityManagerFactoryBean appEntityManagerFactory(EntityManagerFactoryBuilder builder, DataSource appDataSource) {
        return builder
                .dataSource(appDataSource)
                .build();
    }
}