Переменный источник данных в зависимости от пользователя - PullRequest
0 голосов
/ 22 мая 2018

В настоящее время я разрабатываю серверную часть и впервые запускаюсь с законами безопасности и т. Д., И это немного усложнило дизайн моей БД:

Спецификация

Центральный сервер для приложенияс БД, содержащей ограниченную информацию о пользователе (user_id, email, пароль (хешированный и соленый)), может быть где угодно.

Организации, использующие наш сервис, требуют, чтобы вся другая информация хранилась внутри компании, поэтому база данных для этогоконкретная организация находится в их здании.

Идентификаторы пользователей в нашей центральной базе данных используются несколькими типами пользователей в базах данных этих организаций, где хранится дополнительная информация об этом пользователе (номер телефона, имя, адрес ...)

Проблема

В Spring Boot мне нужно сделать так, чтобы используемый источник данных определялся тем, какой пользователь делает запрос.Я сопоставляю пользователей с базой данных их соответствующей организации на центральном сервере, чтобы информация была там, но я не уверен, как сделать эту переменную.

Я понимаю, что существуют методы, включающие добавление другой конфигурации базы данных в файл application.properties.Но, насколько мне известно, это нельзя изменить (легко) после того, как сервер будет развернут и запущен без полного повторного развертывания, и я надеюсь построить это таким образом, чтобы добавление другой организации включало только настройку ихдБ, и добавление других деталей базы данных на центральный сервер.

Дополнительная информация

Я бы хотел использовать для этого CrudRepository с объектами гибернации.Я планирую генерировать только идентификаторы пользователей на центральном сервере.

Любые указатели будут великолепны.

Спасибо!

1 Ответ

0 голосов
/ 22 мая 2018

Терминология для этого - многопользовательская база данных.Существует несколько стратегий для мультитенантности: разные базы данных, разные схемы в одной базе данных и одна и та же схема в одной базе данных с определенным дискриминатором.

Вы в основном создаете класс DataSourceBasedMultiTenantConnectionProviderImpl, который обеспечивает соединение с источником данных на основе того, какой клиент запрашивает его, и класс CurrentTenantIdentifierResolverImpl, который определяет, кто является запрашивающим арендатором.

Подробнее об этом можно прочитать здесь .Поскольку каждый из ваших арендаторов имеет свою собственную базу данных, вы, вероятно, захотите сосредоточиться на подходе с несколькими арендаторами отдельных баз данных.Когда я это реализовал, с CrudRepository все работало нормально.Возможно, вы также захотите найти свой собственный способ создания карты арендаторов, поскольку у меня было 2 арендатора, и мне не нужно было добавлять больше в любой точке.

Вот пример провайдера соединений, когда я реализовал это:

public class DataSourceBasedMultiTenantConnectionProviderImpl extends AbstractDataSourceBasedMultiTenantConnectionProviderImpl {

    private static final String DEFAULT_TENANT_ID = "A";

    @Autowired
    private DataSource datasourceA;

    @Autowired
    private DataSource datasourceB;

    private Map<String, DataSource> map;

    @PostConstruct
    public void load() {
        map = new HashMap<>();
        map.put("A", datasourceA);
        map.put("B", datasourceB);
    }

    @Override
    protected DataSource selectAnyDataSource() {
        return map.get(DEFAULT_TENANT_ID);
    }

    @Override
    protected DataSource selectDataSource(String tenantIdentifier) {
        return map.get(tenantIdentifier);
    }
}
...