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

基本介绍

services.BizCtx()返回当前请求的业务上下文只读视图。源码插件通过services.BizCtx()访问,动态插件通过plugin.yaml声明service: bizctx后使用pluginbridge.Default().BizCtx()客户端访问。它只有一个方法Current(ctx),返回CurrentContext结构体。

该服务适合插件在路由、钩子或任务回调中读取当前用户、租户和模拟状态。

能力阶段:运行期

类型支持:源码插件、动态插件

能力设计

上下文视图模型

CurrentContext是插件稳定视图,不包含宿主内部认证对象或数据库实体。视图字段覆盖请求身份、租户范围和模拟状态:

字段说明
UserID当前认证用户标识
Username当前认证用户名
TenantID当前请求租户标识,0通常表示平台上下文
ActingUserID模拟场景下的真实平台用户标识
ActingAsTenant当前请求是否以租户视角操作
IsImpersonation当前令牌是否代表模拟登录
PlatformBypass当前请求是否允许绕过租户过滤

WithCurrentContext注入的TenantID0时,PlatformBypass会被自动标记为true。插件不应自行修改该标记,而应把它视为宿主对当前请求范围的判断。

上下文注入流程

只读数据语义

BizCtxService是只读数据,插件无法通过它修改请求上下文。如需租户切换或令牌变更,应使用认证能力。在非请求场景或上下文未注入时,会返回零值结构体,调用方应检查关键字段是否有效。

接口定义

源码插件接口

方法说明
Current返回当前请求的CurrentContext只读视图

动态插件接口

动态插件通过hostServices.bizctx声明授权的方法:

动态方法说明
current.get返回当前请求的CurrentContext只读视图

能力使用

源码插件使用

源码插件通过services.BizCtx().Current(ctx)读取当前请求上下文:

current := services.BizCtx().Current(ctx)
if current.UserID == 0 {
return errors.New("未认证用户")
}
if current.IsImpersonation {
// 记录模拟登录审计
log.Infof("用户 %d 正在模拟访问租户 %d", current.ActingUserID, current.TenantID)
}

需要给插件自有表追加tenant_id条件时,源码插件使用TenantFilter(),动态插件使用data服务授权。

动态插件使用

动态插件在plugin.yaml中声明bizctx服务:

hostServices:
- service: bizctx
methods:
- current.get

动态插件通过pluginbridge.Default().BizCtx()客户端调用:

bizCtxSvc := pluginbridge.Default().BizCtx()
current := bizCtxSvc.Current(ctx)
if current.UserID == 0 {
return errors.New("未认证用户")
}

设计约束

  • 只读数据。 插件无法通过BizCtxService修改请求上下文;如需租户切换或令牌变更,应使用认证能力。
  • 零值表示缺失。 非请求场景或上下文未注入时会返回零值结构体,调用方应检查关键字段。
  • 不暴露宿主类型。 CurrentContext是插件稳定视图,不包含宿主内部认证对象或数据库实体。
  • 租户过滤由专用服务处理。 需要给插件自有表追加tenant_id条件时,源码插件使用TenantFilter(),动态插件使用data服务授权。

相关服务