簡體   English   中英

Spring 啟動1數據庫多數據庫用戶

[英]Spring Boot 1 database multiple database users

我目前正在構建一個訪問數據庫的安靜的 API(帶有 Spring 引導)。 此應用程序最終將托管在服務器上。

我想做的事:

  1. 為數據庫配置多個用戶,並為不同的表分配不同的權限
  2. 根據調用的端點,使用特定用戶在該 function 中執行該查詢

我該如何配置上面的應用程序?

到目前為止我找到的答案涉及配置多個數據源,但是對於上述應用程序,只有一個數據源,但有多個用戶。

我已閱讀以下鏈接,但仍在嘗試理解它

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

我是否使用相同的 URL(在本例中為 jdbcURL)配置多個數據源,並為每個角色配置多組用戶名和密碼?

謝謝!

您已經找到了完成該任務的最佳方法,我的意思是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());
    }
}

我會定義多個DataSource ,每個都有不同的用戶,但指向相同的(數據庫)地址。 您可以按如下方式定義自定義DataSource

@Bean
@Qualifier("userOneDataSource")
public DataSource userOneDataSource() {
    DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
    dataSourceBuilder.driverClassName("your.driver.class");
    dataSourceBuilder.url("jdbc:same:url/here");
    dataSourceBuilder.username("User1");
    dataSourceBuilder.password("Pass1");
    return dataSourceBuilder.build();
}

您可以根據需要定義任意數量。 從那里,您可以為每個DataSource創建多個JdbcTemplateJpaRepository

@Repository
public class UserOneDao extends JdbcDaoSupport {
    @Autowired
    public UserOneDao(@Qualifier("userOneDataSource") DataSource dataSource){
        setDataSource(dataSource);
    }
}

@Repository
public class UserTwoDao extends JdbcDaoSupport {
    @Autowired
    public UserOneDao(@Qualifier("userTwoDataSource") DataSource dataSource){
        setDataSource(dataSource);
    }
}

並且從您的@Controller中,您可以調用您想要的任何 DAO。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM