Для этой проблемы вам нужно будет ввести концепцию иерархии клиентов, например
McDonald (Main Tenant)
McDonald Seattle
McDonald Oregon
McDonald Newyork
Таким образом, вы можете сделать так, чтобы родительский клиент содержал всех бизнес-пользователей, а затем назначил им доступ к соответствующим дочерним арендаторам. В случае, если у вас есть пользователь, работающий в нескольких арендаторах, разрешите пользователю установить логин после контекста клиента для клиента root. Это поможет вам определить контекстного клиента и соответствующим образом загрузить данные.
Существует множество сценариев использования, в которых дочерний клиент может иметь своих собственных пользователей. Это может также сопровождаться вопросом, например, могу ли я повысить пользователя из дочернего арендатора до родительского арендатора, такого как региональный менеджер, который может управлять сетью ресторанов.
После входа в систему вы можете проверить, есть ли у пользователя войдите в систему для одного арендатора (который когда-либо был в иерархии [родитель / арендатор]), в этом случае вы можете разрешить прямой вход, иначе запросите страницу настройки контекста арендатора, чтобы направить его к соответствующему арендатору.
В В случае ACL нам, возможно, придется назначать роли и разрешения по арендатору (достаточно столбца tenantId), это помогает пользователю играть роль менеджера в одном дочернем арендаторе (McDonald Seattle
) и роль продавца в (McDonald Newyork
) арендаторе.
Например, у меня может быть следующая модель. Это будет установлено при выборе клиента, и с этого момента я смогу использовать разрешения / роли для проверки из этого контекста, так что больше не будет вызовов db et c. Это можно сделать как в пользовательском интерфейсе, так и на уровне REST API (на уровне REST API место, где мы аутентифицируем пользователя, может настроить это, и слои API, Services, BusinessRules будут использовать это как источник истины, чем нажатие база данных)
class UserContext {
String userName,
Guid Id,
Guid TenantId,
Roles[] TenantRoles,
String[] Permissions
}