B(大账户)模式的子账户功能说明

开放平台B(大账户)模式的子账户功能主要的作用是控制B(大账户)模式开发者账户的权限,通过使用子账户功能可以在开发者账户的权限范围内创建子账户,给不同的子账户分配不同的权限从而实现授权管理的目的。

为什么要使用子账户功能

子账户需要解决的一个核心问题是如何在不暴露B(大账户)模式开发者的AccessToken的情况下安全的授权别人访问设备。因为一旦开发者的AccessToken暴露出去会带来安全风险,别人可以有机会操作开发者账户下所有的设备资源。

子账户功能是一种长期有效的权限控制机制,通过分出不同权限的子账号,将不同的权限分给不同的用户,这样一旦子账户泄露也不会造成全局的信息泄露。

基本概念

以下是一些基本概念的简单解释: 子账号:从萤石开放平台开发者账号中创建出来的子账号,在创建时可以分配独立的密码和权限,每个子账号有一个Id。

  • 授权策略(Policy):用来定义权限的规则,比如预览某个设备。
  • 资源(Resource):用户可以访问的资源,比如序列号为469631729的设备,或者序列号为469631729的设备的第1个通道;

使用场景

如果您购买了萤石设备或实现了萤石协议的海康设备,并把这些设备挂在开发者萤石账号下;您的组织里有多个用户需要使用这些设备,这些用户只能共享开发者账号生成的AccessToken,这里就有一个问题:您无法控制特定用户能够访问哪些设备的权限。

解决办法:通过子账户功能可以实现权限控制。开发者账号称为主账户,创建出来的账户称为子账户,子账户只能使用主账户授权的操作和设备资源。

1、子账户创建数量无限制2、设备授权给不同子账户无限制

子账户功能应用场景实践

以教育机构视频监控系统场景为例,某幼儿园有十个教室,每个教室有2个萤石摄像头,幼儿园管理员有这20个萤石设备的拥有权。幼儿园开发了一套用于家长看自己孩子教室学习情况视频的app(集成OpenSDK),家长在此app上注册账号,幼儿园管理员分配相应教室的摄像头预览权限给此家长账号,并且限制家长只能可以看自己孩子所在教室的设备的实时视频,不能进行云台控制、视频加密等设备操作。 子账户方案描述如下图所示:

方案详细描述如下:

  1. App用户注册。App用户是App的终端用户,属于开发者的用户,和萤石云或萤石开放平台账户无关。

  2. 创建子账户。对每个有效的App用户来说,需要AppServer能定义出每个App用户的访问权限(用Policy语法描述);为每个App用户指定一个具有访问权限的子账户,如果没有则需要创建一个指定访问权限的子账户,AppServer保存App用户和子账户的对应关系。

    萤石开放平台支持通过接口方式创建子账户,App终端用户对子账户不感知。

    在此场景中,创建一个子账户"教室A学生家长"的子账户,并授权这个子账户只能访问设备C6(519928976)、C2C(470686804),并且支持查询设备信息和预览回放权限,

    {
     "Statement": [
         {
             "Permission": "Get,Real,Replay",
             "Resource": [
                 "dev:519928976",
                 "dev:470686804"
             ]
         }
     ]
    }
    
  3. App用户登录。

  4. AppServer获取当前App用户对应的子账户,并请求萤石云开放平台获取一个该子账户"教室A"的访问令牌(AccessToken)。
  5. 萤石开放平台返回给AppServer一个有效的访问凭证,包括AccessToken以及过期时间。
  6. AppServer将访问凭证返回给ClientApp。ClientApp可以缓存这个AccessToken。当AccessToken失效时,ClientApp需要向AppServer申请新的AccessToken。
  7. 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权限。

results matching ""

    No results matching ""