abp vnext多租户之获取租户流程

先引申一个问题:用户登录后如何获取用户信息?
有很多种方式,从token中获取、从cookie中获取、从请求头中获取、从域名中获取、从url中获取、其它自定义获取方式。注意:token本身可以放在cookie或者请求头里,这里之所以把cookie和请求头加上去,是为了举例。
所以,多租户也是同样的道理。

1.获取租户信息的思路
就像用户登录后,每次HTTP请求都要获取用户信息一样。

假设我们有一个类,专门用来获取租户信息,又或者叫专门解析租户信息,给这个类起个名字叫:TenantResolver。嗯,abp vnext就是用的这个类名。

这个类只有一个方法:ResolveTenantIdOrNameAsync,负责解析租户的ID或名称。不过,这个方法不是真正的解析租户的方法。真真正正负责获取租户的,还不是这个类,而是一个个具体的类,这些类都有一个唯一的方法:ResolveAsync,在这个方法里获取租户信息。

什么叫一个个具体的类?比如:有一个类专门从token中获取、有一个类专门从url中获取,每一个类都具体的真真正正的获取租户信息。而TenantResolver类则是把这些租户解析器都拿过来,放到一个集合里,然后去遍历逐个获取租户信息,如果有,立即退出循环,停止获取。

拿到租户ID或名称后,是不是要判断这个租户是否合法有效?怎么判断?可以先将租户存储到数据库、缓存、配置文件,存哪,就从哪查询数据,然后再判断。

租户合法有效后,是不是要拿到租户的信息了?包括数据库连接字符串。只有拿到租户的数据库连接字符串才能切换租户,访问租户对应的数据库。

2.具体实现
先说默认实现类:CurrentUserTenantResolveContributor,这个类是abp vnext默认的租户解析类。即从当前用户CurrentUser中获取租户的ID或名称。我们在实际开发中用这个默认的就行了。如果想从请求头中获取租户信息,可以单独配置,我在此处就不说了。官方网文档有。

看下人家官方文档提供的:
CurrentUserTenantResolveContributor: 如果当前用户已登录,从当前用户的声明中获取租户Id. 出于安全考虑,应该始终将其做为第一个Contributor.
QueryStringTenantResolveContributor: 尝试从query string参数中获取当前租户,默认参数名为"__tenant".
RouteTenantResolveContributor:尝试从当前路由中获取(URL路径),默认是变量名是"__tenant".所以,如果你的路由中定义了这个变量,就可以从路由中确定当前租户.
HeaderTenantResolveContributor: 尝试从HTTP header中获取当前租户,默认的header名称是"__tenant".
CookieTenantResolveContributor: 尝试从当前cookie中获取当前租户.默认的Cookie名称是"__tenant".

一个个TenantResolveContributor,就是一个个具体的实现类了。至于老外为啥加Contributor后缀,我就不懂了。

3.获取租户配置信息
需要实现ITenantStore接口,只要实现这个接口就行了。abp vnext框架会自动将实现类注入到容器里。这个接口有4个方法,分别是:Find(string name),Find(Guid id),FindAsync(string name),FindAsync(Guid id)。根据名称和ID获取租户,并返回TenantConfiguration。TenantConfiguration类包含租户的ID、名称、数据库连接字符串。

 

posted @ 2023-02-13 14:06  屌丝大叔的笔记  阅读(696)  评论(0编辑  收藏  举报