Spring Boot 1 数据库多数据库用户

Posted

技术标签:

【中文标题】Spring Boot 1 数据库多数据库用户【英文标题】:Spring Boot 1 database multiple database users 【发布时间】:2019-10-28 11:48:53 【问题描述】:

我目前正在构建一个访问数据库的 RESTful API(使用 Spring Boot)。此应用程序最终将托管在服务器上。

我想做的事:

    为数据库配置多个用户,并分配他们 对不同表格的不同权限 根据调用的端点,使用特定用户在该函数中执行查询

我该如何配置上面的应用程序?

目前我找到的答案涉及到配置多个数据源,但是对于上面的应用,只有一个数据源,但是有多个用户。

我已阅读以下链接,但仍在努力理解它

https://kimrudolph.de/blog/spring-datasource-routing

我是否使用相同的 URL(在本例中为 jdbcURL)配置多个数据源,并为每个角色配置多组用户名和密码?

谢谢!

【问题讨论】:

关于您的问题:是的,我会这样做。 【参考方案1】:

你已经找到了完成这项任务的最佳方法,我的意思是AbstractRoutingDataSource。如果您有固定数量的用户,这是您可以使用以下方法的最简单方法:

public final class RoutingDataSource extends AbstractRoutingDataSource 
    @Override
    protected Object determineCurrentLookupKey() 
        return UserContextHolder.getUserName() + "DataSource";
    

及配置:

@Bean
@Qualifier("user1DataSource")
public DataSource userOneDataSource() 
    return DataSourceBuilder.create()
            .username("user1")
            .password("pass")
             ...
             .build();


@Bean
@Qualifier("user2DataSource")
public DataSource userOneDataSource() 
    return DataSourceBuilder.create()
            .username("user2")
             ...
             .build();


@Bean
@Primary
public RoutingDataSource dataSource(Map<String, DataSource> datasources) 
    return new RoutingDataSource().dataSource(datasources);
 

如果您需要在运行时添加用户和数据源,您可以使用如下方式:

public final class RoutingDataSource extends AbstractRoutingDataSource 
    private final ConcurrentHashMap<String, DataSource> dynamicDataSources = new ConcurrentHashMap<>();

    @Override
    protected Object determineCurrentLookupKey() 
        return UserContextHolder.getUserName() + "_datasource";
    

    @Override
    protected DataSource determineTargetDataSource() 
        String currentLookupKey = this.determineCurrentLookupKey().toString();
        String userName = UserContextHolder.getUserName();
        String password = UserContextHolder.getPassword();

        return this.dynamicDataSources.computeIfAbsent(currentLookupKey, (key) -> DataSourceBuilder.create()
                .driverClassName("your.driver.class")
                .url("jdbc:same:url/here")
                .username(userName)
                .password(password)
                .build());
    

【讨论】:

以上是关于Spring Boot 1 数据库多数据库用户的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot任务管理

Spring Boot 配置元数据

Spring Boot 中的多租户

Spring Boot配置多数据源的四种方式

Spring boot JPA - 使用额外的列查询多对多

Spring Boot + Security + JWT 实现Token验证+多Provider——登录系统