Создание одного приложения с несколькими базами данных - PullRequest
1 голос
/ 06 июля 2019

Не думаю, что я правильно описал проблему в заголовке. Однако у меня есть приложение .NET Core Web Api, которое будут использовать все мои клиенты. Помимо одного экземпляра API, у меня есть один экземпляр Vuejs внешнего интерфейса, который все арендаторы могут использовать в качестве «портала».

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

Вы не можете претендовать на другого арендатора, поскольку все API-интерфейсы требуют авторизации против арендаторов.

Полагаю, я застрял в том, чтобы определить, к какому арендатору принадлежит пользователь при входе в систему с использованием единственного экземпляра внешнего интерфейса vuejs. Это не проблема, когда речь идет просто об использовании API, поскольку арендатор может быть отправлен через заголовок запроса, но я не уверен, как разрешить арендатора, чтобы определить правильный БД для использования с помощью знака, который будет используется для всех арендаторов.

Извиняюсь, если я не объяснил проблему хорошо, это сложная ситуация.

Ответы [ 3 ]

0 голосов
/ 06 июля 2019

где живут ваши пользователи?Возможно, вам придется извлечь информацию о пользователях в отдельную базу данных идентификации, которая содержит информацию о том, какой пользователь принадлежит какому арендатору.Это может быть так же просто, как хранилище Key-Value: email-> TenantId.Таким образом, для входа в систему вам нужно найти этот tenantId, а затем выполнить аутентификацию по информации о пользователе в правильной базе данных клиентов.

Или вы можете собрать всю свою информацию о пользователе в единую базу данных, которая содержит всю информацию опользователь, включая хэш пароля.Вы также можете использовать некоторый провайдер идентификации, такой как Auth0 или IdentityServer - у них есть возможность добавлять пользовательские свойства, такие как TenantId.

. Какой бы сценарий вы ни выбрали, у вас должно быть одно место, куда вы сопоставляете пользователя.арендатор.Просмотр информации о пользователе в нескольких базах данных не идеален.

Если ваше приложение Vue.js использует ваш внутренний API, вы можете установить TenantId в cookie или другим способом сохранить эту информацию между вызовами.

0 голосов
/ 06 июля 2019

Я бы использовал подобное решение, как это

https://docs.servicestack.net/multitenancy

ServiceStack предоставляет несколько способов изменения соединения с базой данных, используемого во время выполнения, на основе входящего запроса. Вы можете использовать фильтр запросов, использовать атрибут фильтра запросов [ConnectionInfo], использовать атрибут [NamedConnection] в Auto Query Services, получать доступ к именованным соединениям в реализациях Custom Service или переопределять GetDbConnection (IRequest) в AppHost.

Вне зависимости от того, используете ли вы WebAPI или ServiceStack (я лично являюсь его поклонником). По сути, вам нужно создать интерфейс IForTenant и заставить ваши сервис-модели реализовывать их.

public interface IForTenant
{
    string TenantId { get; }
}

Вам понадобится фабрика соединений с БД, которая принимает идентификатор арендатора в качестве аргумента для возврата экземпляра IDbConnection. Затем вы создаете фильтр запроса, который проверяет, имеет ли запрос тип IForTenant, и получает правильный экземпляр IDbConnection от вышеупомянутой фабрики.

0 голосов
/ 06 июля 2019

Если бы все БД имели одинаковую структуру, я бы использовал только одну базу данных и использовал бы идентификатор арендатора в качестве индекса, таким образом у вас было бы только одно соединение в вашем проекте, и проблема была решена.В противном случае вам придется проверять все базы данных каждый раз, когда пользователь пытается войти в систему.

...