B(大账户)模式的子账户功能说明
开放平台B(大账户)模式的子账户功能主要的作用是控制B(大账户)模式开发者账户的权限,通过使用子账户功能可以在开发者账户的权限范围内创建子账户,给不同的子账户分配不同的权限从而实现授权管理的目的。
为什么要使用子账户功能
子账户需要解决的一个核心问题是如何在不暴露B(大账户)模式开发者的AccessToken的情况下安全的授权别人访问设备。因为一旦开发者的AccessToken暴露出去会带来安全风险,别人可以有机会操作开发者账户下所有的设备资源。
子账户功能是一种长期有效的权限控制机制,通过分出不同权限的子账号,将不同的权限分给不同的用户,这样一旦子账户泄露也不会造成全局的信息泄露。
基本概念
以下是一些基本概念的简单解释: 子账号:从萤石开放平台开发者账号中创建出来的子账号,在创建时可以分配独立的密码和权限,每个子账号有一个Id。
- 授权策略(Policy):用来定义权限的规则,比如预览某个设备。
- 资源(Resource):用户可以访问的资源,比如序列号为469631729的设备,或者序列号为469631729的设备的第1个通道;
使用场景
如果您购买了萤石设备或实现了萤石协议的海康设备,并把这些设备挂在开发者萤石账号下;您的组织里有多个用户需要使用这些设备,这些用户只能共享开发者账号生成的AccessToken,这里就有一个问题:您无法控制特定用户能够访问哪些设备的权限。
解决办法:通过子账户功能可以实现权限控制。开发者账号称为主账户,创建出来的账户称为子账户,子账户只能使用主账户授权的操作和设备资源。
注
1、子账户创建数量无限制
2、设备授权给不同子账户无限制
子账户功能应用场景实践
以教育机构视频监控系统场景为例,某幼儿园有十个教室,每个教室有2个萤石摄像头,幼儿园管理员有这20个萤石设备的拥有权。幼儿园开发了一套用于家长看自己孩子教室学习情况视频的app(集成OpenSDK),家长在此app上注册账号,幼儿园管理员分配相应教室的摄像头预览权限给此家长账号,并且限制家长只能可以看自己孩子所在教室的设备的实时视频,不能进行云台控制、视频加密等设备操作。 子账户方案描述如下图所示:
方案详细描述如下:
App用户注册。App用户是App的终端用户,属于开发者的用户,和萤石云或萤石开放平台账户无关。
创建子账户。对每个有效的App用户来说,需要AppServer能定义出每个App用户的访问权限(用Policy语法描述);为每个App用户指定一个具有访问权限的子账户,如果没有则需要创建一个指定访问权限的子账户,AppServer保存App用户和子账户的对应关系。
萤石开放平台支持通过接口方式创建子账户,App终端用户对子账户不感知。
在此场景中,创建一个子账户"教室A学生家长"的子账户,并授权这个子账户只能访问设备C6(519928976)、C2C(470686804),并且支持查询设备信息和预览回放权限,
{ "Statement": [ { "Permission": "Get,Real,Replay", "Resource": [ "dev:519928976", "dev:470686804" ] } ] }
App用户登录。
- AppServer获取当前App用户对应的子账户,并请求萤石云开放平台获取一个该子账户"教室A"的访问令牌(AccessToken)。
- 萤石开放平台返回给AppServer一个有效的访问凭证,包括AccessToken以及过期时间。
- AppServer将访问凭证返回给ClientApp。ClientApp可以缓存这个AccessToken。当AccessToken失效时,ClientApp需要向AppServer申请新的AccessToken。
- ClientApp使用AccessToken去请求萤石开放平台API(包括OpenSDK接口和Http接口)。萤石开放平台会根据请求参数中的AccessToken验证该子账户是否有访问设备的权限,只有满足API接口最小权限要求的请求才被允许。如果用户查询设备列表,云平台只会返回子账户有访问权限的设备信息。
在此场景中,用户查询设备列表,云平台只返回设备C6(519928976)、C2C(470686804)的信息;如果对其它设备或这2个设备进行云台控制、视频加密操作,云平台会返回拒绝访问的错误码。
子账户授权策略(Policy)配置
Policy当中有一个Statement(一条Policy当中可以有多条Statement)。Statement里面规定了相应的Permission、Resource。 下面是一个授权策略(Policy)示例:
{
"Statement": [
{
"Permission": "Get,Update,DevCtrl",
"Resource": [
"dev:469631729",
"cam:544229080:1"
]
},
{
"Permission": "Get,Real",
"Resource": [
"dev:470686804"
]
}
]
}
这个Policy把开发者萤石账号下的469631729、544229080、470686804等设备资源进行授权,并且分别支持Get、Update、DevCtrl、Real权限。
配置细则
Statement
通过Statement描述授权语义,每条包含对Permission、Resource的描述。每次请求系统会逐条依次匹配检查,如果匹配成功的都为通过,该条请求即鉴权通过。如果没有任何条目匹配成功,该条请求被禁止访问。
Permission
包括以下权限:
Permission | 适用资源类型 | 描述 |
---|---|---|
Update | dev、cam | 修改资源,例如修改设备名称、通道名称 |
Get | dev、cam | 查询资源信息,包括配置信息等 |
DevCtrl | dev、cam | 设备完全控制,包括Real、Replay、Alarm、Capture、Video、Ptz、Upgrade、Format、Pipe、Config等现已定义的设备操作权限和以后定义的设备操作权限 |
Real | dev、cam | 视频预览 |
Replay | dev、cam | 视频回放(包括本地录像回放和云存储回放) |
Alarm | dev | 获取设备告警信息,订阅告警消息 |
Capture | dev、cam | 设备抓图 |
Video | dev、cam | 设备录像 |
Ptz | dev、cam | 设备云台控制 |
Upgrade | dev | 设备升级 |
Format | dev | 格式化设备磁盘 |
Pipe | dev | 使用开放平台透明通道功能 |
Config | dev、cam | 配置设备,例如视频加密,布撤防,关联NVR和IPC等 |
备注:当前版本子账户没有添加、删除设备权限;子账户客户端可以把添加、删除设备请求发送到开发者后台服务,后台服务再以开发者的身份调用开放平台接口添加、删除设备。
Resource
Resource是指萤石开放平台上被授权的某个具体对象,resource的规则是 {resourceType}:{resourceId};
- resourceType: 表示资源类型,现在只有2种资源类型,dev(设备)、cam(通道);
- resourceId:表示资源Id,dev类型的resourceId是设备序列号,cam类型的resourceId是设备序列号:通道号
隶属关系
cam资源隶属于dev资源,子账户对dev资源的权限可传递到cam资源。例如,有2个资源dev:544229080和cam:544229080:1,cam:544229080:1隶属于dev:544229080;如果开发者把dev:544229080资源的Real权限授权给子账户,则该子账户默认对cam:544229080:1拥有Real权限。