我认为我没有通过标题正确描述问题。但是,我有一个.NET Core Web Api应用程序,所有租户都将使用。除了单个API实例,我还有一个前端Vuejs实例,所有租户都可以将其用作“门户”。
这些租户都有各自的数据库。当前api都需要在请求中包含tenant
的标头,以指定要向哪个租户发出请求,然后将根据请求中的租户创建数据库连接。
您不能假装其他租户,因为所有api都需要针对租户db的授权。
我想坚持的事情是在使用单个前端vuejs实例登录时确定用户所属的租户。当仅使用api时这不是问题,因为可以通过请求的标头发送承租人,但是我不确定如何解析承租人,以便确定将由哪个符号使用的正确db。在所有租户中使用。
抱歉,如果我没有很好地解释问题,那是一个棘手的情况。
答案 0 :(得分:0)
如果所有数据库都具有相同的结构,那么我将仅使用一个数据库,并使用租户ID作为索引,这样您的项目中就只有一个连接,问题就解决了。否则,您每次用户尝试登录时都必须检查所有数据库。
答案 1 :(得分:0)
您的用户住在哪里?您可能必须将用户信息提取到一个单独的身份数据库中,该数据库包含该用户属于哪个租户的信息。这可以像键值存储一样简单:email-> TenantId。因此,要登录,您必须查找此tenantId
,然后根据正确的租户数据库中的用户信息进行身份验证。
或者您可以将所有用户信息拉入一个数据库,其中包含有关该用户的所有信息,包括密码哈希。您还可以使用某些身份提供程序,例如Auth0或IdentityServer-这些功能可以添加用户属性,例如TenantId
。
无论选择哪种方案,都必须在一个将用户映射到租户的地方。在多个数据库中查找用户信息并不理想。
如果您的Vue.js应用使用的是后端API,则可以通过Cookie或其他方式设置TenantId,以在两次调用之间保留此信息。
答案 2 :(得分:0)
我会使用类似的解决方案
https://docs.servicestack.net/multitenancy
ServiceStack提供了多种方法,可根据传入的请求更改运行时使用的数据库连接。您可以使用请求过滤器,使用[ConnectionInfo]请求过滤器属性,使用自动查询服务上的[NamedConnection]属性,访问自定义服务实现中的命名连接或在AppHost中覆盖GetDbConnection(IRequest)。
由您决定使用WebAPI还是ServiceStack(我个人是后者的粉丝)。基本上,您要做的就是创建一个接口IForTenant,并让您的服务模型实现它们。
public interface IForTenant
{
string TenantId { get; }
}
您将需要一个以租户id作为参数的数据库连接工厂,以返回IDbConnection实例。然后创建一个请求过滤器,检查请求是否为IForTenant类型,并从上述工厂中获取正确的IDbConnection实例。