# 子账号访问控制管理

## 应用场景

当企业内部存在多账号协同操作的场景时，可以使用子账号管理功能来为不同职责的员工创建不同角色的子账号。常规的子账号解决的是功能访问权限划分问题，比如“上传者”角色的子账号只能使用上传客户端上传视频，“编辑员”角色的子账号只能上传和修改视频信息，无法修改播放器和系统设置等，详见[子账号管理](https://git.polyv.net/help-center/document-center/-/blob/master/vod/product/manual/setting/sub_account/README.md)。

但是在某些场景下，企业希望能够只允许子账号访问一部分的视频资源，或者只允许子账号调用一部分的API接口。

### 场景一

在线教育公司A旗下有三个子品牌，每个子品牌都作为独立项目进行开发，每个项目都会用到视频点播服务。

公司A有如下要求：

* 项目独立管理：每个开发团队独立管理各自的开发密钥信息以及项目所需的视频资源，不希望项目间相互干扰。
* 按项目分账：财务部门希望能够根据各项目的视频云资源使用情况进行财务成本分摊。
* 共享视频点播服务：各项目共享公司采购的视频云服务，公司上传的部分视频资源也会由各项目共享使用。

### 场景二

公司B是视频内容生产商，其拥有的视频资源除了自己平台使用外，还会授权给合作伙伴使用，合作伙伴都有自己开发的平台。

公司B有如下要求：

* 需要能够创建具有开发权限的子账号给合作伙伴使用，合作伙伴使用子账号的开发密钥信息进行视频的上传、播放、管理等操作。
* 主账号可随时控制子账号的状态、可访问的视频资源范围、API权限范围等。
* 主账号可查询每个子账号的视频资源用量，与合作伙伴进行计费结算。

**在上述类似的业务场景下，可通过点播管理后台的【账号管理】功能创建“内容分发”角色的子账号，并为其分配相应的视频资源访问权限和API调用权限。**

![image-20200908111150007](/files/WGhru8bTl0EkHOQS3psN)

## 功能使用说明

### 一、创建“内容分发”角色的子账号

#### 1) 登录点播管理后台，点击 **【账号管理】** → **【添加子账号】**，设置子账号的相关信息。**注意：子账号角色要选择“内容分发”。**

![image-20200908112706805](/files/vsovDvEKEgtigLtXKwqc)

![image-20200908113034100](/files/8Co0JdXtJnWYwFtuD9Ho)

#### 2) 子账号创建成功后，点击子账号列表操作栏的【修改】，可看到子账号已拥有独立的appId和secretkey。点击【访问控制】，可为子账号设置访问控制权限。

![image-20200908144159751](/files/YFEaWlKEyhseOqWx6Iho)

![image-20200908113404732](/files/ZP37s3OYKX8goVGb6cU9)

#### 3) 视频分类授权设置功能说明如下：

* 当选择“全部分类”后，子账号将拥有点播主账号下所有视频资源的访问权限。
* 当设置禁止访问的分类后，子账号将拥有除禁止访问的视频分类外，所有视频资源的访问权限。
* 当设置允许访问的分类后，子账号将只可以访问该项设置的分类。
* 分类可设置多个，但只能选择一级分类。多个子账号可共享某一分类的访问权限。

#### 4) API权限设置功能说明如下：

* 点播视频播放权限：设置此权限后，子账号可通过自身的appId和secretkey调用创建Playsafe Token的API接口，从而能够播放加密视频，详见[获取视频播放凭证](https://git.polyv.net/help-center/document-center/-/blob/master/vod/api/sub_account/sub_create_token/README.md)。
* 点播视频上传权限：设置此权限后，子账号将能够上传视频至云点播平台。\*\*暂时只支持通过JS SDK上传。\*\*详见：[Web上传SDK使用文档](https://git.polyv.net/help-center/document-center/-/blob/master/vod/upload_js/web_upload_sdk/README.md)。
* 点播服务只读访问权限：设置此权限后，子账号将能够调用部分查询类的API接口：
  * [搜索视频](https://git.polyv.net/help-center/document-center/-/blob/master/vod/api/sub_account/sub_search_video/README.md)
  * [查询视频信息](https://git.polyv.net/help-center/document-center/-/blob/master/vod/api/sub_account/sub_get_video_info/README.md)
  * [查询分类列表](https://git.polyv.net/help-center/document-center/-/blob/master/docs/vod/product/manual/setting/sub_get_categories/README.md)
* 点播服务管理权限：设置此权限后，除上述查询类的API外，子账号将能够调用部分管理类的API接口：
  * [修改视频信息](https://git.polyv.net/help-center/document-center/-/blob/master/vod/api/sub_account/sub_modify_video_info/README.md)
  * [移动视频到指定分类](https://git.polyv.net/help-center/document-center/-/blob/master/vod/api/sub_account/sub_move_video/README.md)
  * [删除视频](https://git.polyv.net/help-center/document-center/-/blob/master/vod/api/sub_account/sub_delete_video/README.md)
  * [创建分类](https://git.polyv.net/help-center/document-center/-/blob/master/vod/api/sub_account/sub_add_category/README.md)
  * [修改分类名称](https://git.polyv.net/help-center/document-center/-/blob/master/vod/api/sub_account/sub_modify_category_name/README.md)
  * [修改分类设置](https://git.polyv.net/help-center/document-center/-/blob/master/vod/api/sub_account/sub_modify_category_setting/README.md)
  * [删除分类](https://git.polyv.net/help-center/document-center/-/blob/master/vod/api/sub_account/sub_delete_category/README.md)

> **注意：子账号的API权限是基于分类授权设置的，也就是说子账号只能够在获得授权的分类下，进行API接口的调用。**

### 二、通过“内容分发”角色的子账号使用云点播服务

拥有对应权限的“内容分发”角色的子账号可以使用云点播的视频上传、播放、管理等服务，视频和分类信息的增删改查可通过API接口来操作，视频上传和播放则需要上传SDK以及播放SDK来实现。

#### 1)子账号使用 JS上传SDK

JS上传SDK的使用文档请参考：[Web上传SDK使用文档](https://git.polyv.net/help-center/document-center/-/blob/master/vod/upload_js/web_upload_sdk/README.md)。需在SDK中设&#x7F6E;***子账号***&#x7684;授权验证信息:

```javascript
videoUpload.updateUserData({
  appId: <appId> , // Polyv云点播子账号的appId
  timestamp: <timestamp> , // 时间戳，注意：系统时间不正确会导致校验失败
  sign: <sign> , // 签名计算方式为：md5(`${secretkey}appId${appId}timestamp${timestamp}${secretkey}`).toUpperCase()。需使用子账号的secretkey计算签名
});
```

***注意：子账号必须拥有视频上传权限才可以上传视频，并且上传的分类目录必须是子账号拥有访问权限的分类。***

#### 2) 子账号使用Web播放器播放加密视频

子账号使用Web播放器，需在嵌入代码中传入子账号身份信息和播放加密视频的token，嵌入代码示例如下：

```javascript
<div id="player"></div>
<script src="//player.polyv.net/resp/vod-player/latest/player.js"></script>
<script>
  var player = polyvPlayer({
    wrap: '#player',
    width: 800,
    height: 533,
    vid: '88083abbf5bcf1356e05d39666be527a_8' ,
    appId:'JmgU6BCGov', // 子账号appId，可在管理后台获取
    playsafe:'81814fed-bdd0-4506-bec1-ebc8093148c5-hfevwsfxcsbcocx', // PC H5播放加密视频所需的token，服务端需使用子账号的appId和secretkey调用创建Playsafe Token接口获取。
    ts:'1568131545000', //移动端H5播放Web加密视频需要传ts、sign参数。ts为13位的毫秒级时间戳
    sign:'88313661ba7ded642c7b557b0a364b4b' // sign从业务方服务端获取，计算规则为：md5(子账号secretkey+vid+ts)
  });
</script>
```

> 1. 子账号appId为必填项
> 2. playsafe参数用于PC H5播放器解密，ts、sign用于移动端H5播放器解密。如果PC和移动端使用同一份代码，则三个参数都需要传值。
> 3. Web播放器的详细功能介绍，请查看：[Web播放器文档](https://git.polyv.net/help-center/document-center/-/blob/master/vod/js/video_player/overview/README.md)。

#### 3) 使用子账号集成iOS/Android SDK

使用子账号集成SDK除了需使用子账号appId、secretkey进行初始化外，与主账号集成SDK并无差别。

Android SDK中需使用`settingsWithAppId()`方法进行初始化：

```java
PolyvSDKClient client = PolyvSDKClient.getInstance();
client.settingsWithAppId(String appId, String secretKey, String userId); // 子账号的appId以及secretkey，userId为主账号的userId
```

iOS SDK中需使用`PLVVodSettings`类中的`+ (instancetype)settingsWithAppId:(NSString *)appId secretKey:(NSString *)secretKey userId:(NSString *)userId`方法进行子账号的初始化。

Polyv点播SDK的使用文档详见：

* [iOS SDK](https://github.com/polyv/polyv-ios-vod-sdk)
* [Android SDK](https://github.com/easefun/polyv-android-sdk-2.0-demo)

### 三、查看子账号的用量统计

登录点播管理后台，点击 **【数据统计】** → **【子账号统计】**，可查看子账号的流量、播放量等统计数据。

![image-20200908154633738](/files/UvZOreXKKWOST21O9IWx)

***注：统计功能需联系客服开通后才可使用***


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://polyv.gitbook.io/document/docs/vod/product/manual/setting/sub_account_privilege.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
