Многопользовательская схема на основе схемы в Loopback 4 - PullRequest
4 голосов
/ 14 марта 2020

Вариант использования

В мультитенантных приложениях на основе схем обычно имеется одна база данных с несколькими схемами. Одна схема является основной, в которой хранятся общие данные приложения, и по одной для каждого владельца приложения. Каждый раз, когда в системе регистрируется новый клиент, в БД автоматически создается новая изолированная схема. Это означает, что схема создается во время выполнения и заранее неизвестна. Схема клиента названа в соответствии с доменом клиента. Когда запрос поступает в систему, пользователь проверяется, и схема выбирается с использованием данных основной схемы. И затем большинство / все последующие операции с базой данных go для схемы арендатора c. Как видите, схема, которую мы хотим использовать, известна только во время выполнения.

Проблема

Как выбрать схему во время выполнения? Мы используем postgres разъем. Мы должны иметь возможность переключать схемы во время выполнения.

Другая проблема заключается в том, как запускать миграции для разных арендаторов?

Примечания:

Необходимо установить db-схему в способ в области запросов, чтобы избежать установки схемы для других запросов, которые могут принадлежать другим клиентам. Задать схему для всего соединения нельзя.

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

Привет от команды LoopBack ?

LoopBack 4 пока не предлагает первоклассную поддержку мультитенантности. Я открыл проблему GitHub, чтобы обсудить различные возможные решения, см. loopback-next # 5056 .

Один из вариантов - настроить класс репозитория, определяемый моделью c, чтобы установить схему на основе текущий пользователь. Это требует небольшого улучшения для реализации в @loopback/repository, поэтому это решение в настоящее время не будет работать из коробки. Я кросс-публикация соответствующей части моего комментария ниже, см. Проблему GitHub для полного контекста.

Облегченная изоляция арендатора с использованием схем

В этой настройке уровень аутентификации и все арендаторы совместно используют то же имя базы данных и использовать те же учетные данные (пользователь базы данных) для доступа к данным. У нас есть 1 + N схем, определенных в базе данных: первая схема используется уровнем аутентификации, плюс у нас есть одна схема для каждого арендатора. Все запросы к базе данных будут использовать один и тот же источник данных LB и, следовательно, совместно использовать один и тот же пул соединений.

В плане реализации нам необходимо настроить способ регистрации модели LB4 в источнике данных. Вместо того, чтобы создавать одну и ту же модель поддержки жонглера для всех пользователей, мы хотим создать модели жонглера, определяемые арендатором c.

Концептуально это можно сделать, настроив конструктор репозитория.

export class ProductRepository extends DefaultCrudRepository<
  Product,
  typeof Product.prototype.id
> {
  constructor(
    @inject('datasources.db') dataSource: juggler.DataSource,
    @inject(SecurityBindings.USER) currentUser: UserProfile,
  ) {
    super(
      // model constructor
      Product, 
      // datasource to use
      dataSource, 
      // new feature to be implemented in @loopback/repository:
      // allow repository users to overwrite model settings
      {schema: currentUser.name},
    );
  }
}
0 голосов
/ 01 апреля 2020

вы можете создать DefaultCrudRepository (реализация по умолчанию CRUD-репозитория с использованием устаревшей модели juggler и источника данных) во время выполнения, для которого требуется два параметра

  1. Источник данных
  2. Модель

Теперь создайте экземпляр Datasource с необходимыми настройками, включая схему, которую вы хотите использовать. Затем предоставьте свою модель и источник данных для экземпляра DefaultCrudRepository, как показано ниже: -

const ds = new PostgresDataSource({
  connector: 'postgresql',
  host: 'some host',
  port: 'some port',
  user: 'some user',
  password: 'password',
  database: 'database',
  schema: 'schema for that particular tenant',
});
const repo =  new DefaultCrudRepository(SomeModel, ds);

и после этого используйте этот репозиторий для выполнения поиска, создания и других методов. Существует пример реализации для этого https://github.com/hitesh2067/dynamic-schema-example

Я передал схему в качестве параметра запроса, но вы можете использовать любой другой способ для предоставления схемы

...