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

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

我想做的事:

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

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

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

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

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

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

谢谢!

【问题讨论】:

  • 关于您的问题:是的,我会这样做。

标签: java spring-boot


【解决方案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());
    }
}

【讨论】:

    猜你喜欢
    • 2015-09-07
    • 2018-02-05
    • 2018-08-18
    • 1970-01-01
    • 2021-08-07
    • 2017-09-29
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    相关资源
    最近更新 更多