爱星物联的租户对应就是我们开发者所属的企业,每个开发者可以拥有一个主租户和加入多个租户,可在开放平台顶部下拉切换
如果想要将成员添加到你的租户,你可以进入授权管理进行添加,但是这里需要注意的是,目前只能添加已注册的用户;
爱星物联租户隔离的方式为共用数据库,通过租户ID(tenant_id)字段隔离的方法,租户Id隔离了产品、固件、设备、App和面板等可由开发者配置的数据;
平台API登录之后,会将租户Id存储到Token中, 后端接口通过解析Token获取租户Id过滤数据; 这里我们可以看看iot_cloud_api_service服务源码的auth.go文件;
平台为了统一获取方法租户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
}