爱星物联多租户介绍

[复制链接]
查看624 | 回复2 | 2024-9-13 08:50:16 | 显示全部楼层 |阅读模式

爱星物联的租户对应就是我们开发者所属的企业,每个开发者可以拥有一个主租户和加入多个租户,可在开放平台顶部下拉切换

image.png

如果想要将成员添加到你的租户,你可以进入授权管理进行添加,但是这里需要注意的是,目前只能添加已注册的用户;

image.png

爱星物联租户隔离的方式为共用数据库,通过租户ID(tenant_id)字段隔离的方法,租户Id隔离了产品、固件、设备、App和面板等可由开发者配置的数据;

image.png

平台API登录之后,会将租户Id存储到Token中, 后端接口通过解析Token获取租户Id过滤数据; 这里我们可以看看iot_cloud_api_service服务源码的auth.go文件;

image.png

平台为了统一获取方法租户Id,封装了相关函数

接口逻辑代码中可调用controls.GetTenantId(c)函数租户Id,通过参数传递给微服务;

func GetTenantId(c *gin.Context) string {
    return c.GetString("tenantId")
}
tenantId := controls.GetTenantId(c)

或者直接使用controls.WithUserContext(c)通过上下文传递给微服务中;

//上下文传参
func WithUserContext(c *gin.Context) context.Context {
    ctx := metadata.NewContext(context.Background(),
       map[string]string{
          "userId":   iotutil.ToString(c.GetInt64("userId")),
          "tenantId": c.GetString("tenantId"),
          "lang":     c.GetHeader("lang"),
          "token":    GetToken(c),
       })
    return ctx
}
ctx := controls.WithOpenUserContext(c)
resp, err := rpc.ClientOemAppService.FindById(ctx, &protosService.OemAppFilter{
    Id: obj.AppId,
})

//上下文接收参数
//但是这里需要注意的就是tenantid的大小写的问题, 传入的时候是tenantId,但是接收的是tenantid, 这是框架进行转换了;
import "go-micro.dev/v4/metadata"
func GetTenantId(ctx context.Context) (string, error) {
    tenantId, _ := metadata.Get(ctx, "tenantid")
    if tenantId == "" {
       return "", errors.New("tenantId not found")
    }
    return tenantId, nil
}

而APP则是在构建成功之后会将租户Id写入到APP安装中, 登录之后将把租户缓存起来,并在调用接口的时候放入Header传给接口过滤

//在AppApi中通用也分装获取的租户的方法, 但是区别是从Header中获取, 应为APP在构建之后就已经确认APP的归属租户了;
func GetTenantId(c *gin.Context) string {
    tenantId := c.GetHeader("tenantId")
    return tenantId
}
回复

使用道具 举报

WT_0213 | 2024-9-13 11:57:58 | 显示全部楼层
回复

使用道具 举报

iiv | 2024-9-13 20:31:35 | 显示全部楼层
不知道说啥了,已经学不过来了,只能666了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则