Spring Boot 1 база данных нескольких пользователей базы данных - PullRequest
2 голосов
/ 28 октября 2019

В настоящее время я создаю спокойный API (с Spring Boot), который обращается к базе данных. Это приложение в конечном итоге будет размещено на сервере.

Что я хотел бы сделать:

  1. Сконфигурировать базу данных с несколькими пользователями и назначить им разные права на разные таблицы
  2. В зависимости от того, какая конечная точка вызывается, используйте конкретного пользователя для выполнения запросов в этой функции

Как мне настроить вышеуказанное приложение?

Ответы I 'До сих пор я обнаружил, что нужно настроить несколько источников данных, но для вышеуказанного приложения есть только один источник данных, но несколько пользователей.

Я прочитал следующую ссылку, но все еще пытаюсь ее понять

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

Должен ли я сконфигурировать несколько источников данных с одним и тем же URL-адресом (в данном случае jdbcURL) и несколькими наборами имен пользователей и паролей для каждой роли?

Спасибо!

1 Ответ

2 голосов
/ 28 октября 2019

Вы уже нашли лучший способ выполнить эту задачу, я имею в виду 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());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...