跳到主要内容
版本:0.3.x(Latest)

基本介绍

租户能力(tenantcap)是LinaPro的框架级可选能力,为插件和宿主提供租户解析、租户可见性校验、用户租户关系查询和租户切换等多租户基础能力。插件通过services.Tenant()获取消费侧接口。

与组织能力类似,租户能力采用能力提供方+消费侧服务模式。提供方插件(如linapro-tenant-core)实现具体租户逻辑,消费侧通过tenantcap.Service接口访问。当提供方不可用时,系统降级到平台租户(PlatformTenantID = 0)的单租户模式。

设计思路

消费侧 Service

tenantcap.Service是面向普通插件和宿主核心服务的消费接口:

  • 可用性检查Available()判断租户能力提供方是否可用
  • 当前租户Current()返回当前请求的租户ID,不可用时返回平台租户
  • 平台绕过PlatformBypass()判断当前请求是否允许跨租户访问
  • 租户可见性EnsureTenantVisible()校验当前用户是否可访问指定租户
  • 用户租户关系ListUserTenants()返回用户可见的活跃租户列表
  • 租户切换SwitchTenant()校验租户切换的合法性

提供方 Provider

tenantcap.Provider定义了租户能力插件必须实现的基础契约:

  • 租户解析ResolveTenant从HTTP请求解析租户身份
  • 租户校验ValidateUserInTenant校验用户对租户的访问权限
  • 租户列表ListUserTenants返回用户可见的活跃租户
  • 租户切换SwitchTenant校验租户切换合法性

tenantcap.Resolver是HTTP请求级租户解析器接口,用于租户中间件在请求进入业务处理前建立租户上下文。多个Resolver可以组成责任链,按配置顺序尝试解析。

架构位置

租户能力在系统中承担多个关键角色:

  • 请求管线:租户解析中间件使用RequestResolver在认证后建立租户上下文
  • 业务处理:插件通过Service读取当前租户、校验可见性
  • 数据过滤:宿主内部使用ScopeService注入租户过滤条件(不暴露给插件)

主要能力

tenantcap.Service(消费侧)的主要方法:

方法说明
Available判断租户能力提供方是否可用
Status返回详细的激活状态和提供方信息
Current返回当前请求租户ID,不可用时返回平台租户
PlatformBypass判断当前请求是否允许绕过租户过滤
EnsureTenantVisible校验当前用户是否可访问指定租户
ValidateUserInTenant校验指定用户是否可访问指定租户
ListUserTenants返回用户可见的活跃租户列表
SwitchTenant校验用户切换到目标租户的合法性

设计约束

  • 降级到平台租户。 当租户能力不可用时,Current()返回PlatformTenantID (0),系统以单租户模式运行。
  • ScopeService不暴露给插件。 租户过滤涉及数据库查询构建器,通过宿主内部接口使用。
  • RequestResolver不暴露给插件。 HTTP请求级租户解析是宿主中间件的职责,普通插件不需要直接使用。
  • ProviderResolver独立注册。 Provider提供租户业务逻辑,Resolver提供HTTP请求解析,两者可以由不同插件实现。

提供方指引

如果需要实现自定义租户能力插件,需要:

  1. 实现tenantcap.Provider接口,提供租户解析、校验、列表、切换等方法
  2. 可选实现tenantcap.Resolver接口,提供HTTP请求级租户解析
  3. 通过tenantcap.Provide(pluginID, factory)注册工厂函数
  4. 工厂函数接收ProviderEnv,包含PluginIDBizCtxPluginLifecycle等宿主服务

提供方插件需要在init()中注册工厂,宿主在首次使用时延迟构造实例。

相关服务

  • OrgService - 组织能力与租户能力互补,共同构成多租户+组织的数据模型
  • BizCtxService - 租户解析结果投影到BizCtxTenantID字段
  • AuthService - 租户切换前使用TenantService校验合法性
  • TenantFilterService - 使用Tenant中的租户信息过滤数据