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

时间:2019-10-28 11:48:53

标签: java spring-boot

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

我想做什么:

  1. 使用多个用户配置数据库,然后分配他们 不同表的权限不同
  2. 根据要调用的端点,使用特定用户在该函数内执行该查询

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

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

我已阅读以下链接,但仍在尝试了解它

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

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

谢谢!

1 个答案:

答案 0 :(得分:2)

您已经找到了完成该任务的最佳方法,我是说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());
    }
}