
# 通过xDM-F的多租户能力实现应用运行态数据的逻辑隔离
#### 操作场景
假设A公司在工业数字模型驱动引擎（Industrial Digital Model Engine，简称iDME）开发了一个应用（PDM），希望将该应用授权给B公司和C公司使用，且两个公司之间的数据不互通。此时，用户可以通过iDME应用提供的多租户能力，创建多个租户，为B公司和C公司的数据进行逻辑隔离。
#### 前提条件
已[登录应用运行态](https://support.huaweicloud.com/consog-idme/idme_consog_0023.html)。
#### 步骤1：创建租户
创建两个租户实例，租户编码分别为tenantB和tenantC。具体操作请参见[租户管理](https://support.huaweicloud.com/usermanual-idme/idme_clientog_0031.html)。
图1租户实例   
![](https://support.huaweicloud.com/bestpractice-idme/figure/zh-cn_image_0000001510435021.png "点击放大")
 #### 步骤2：逻辑隔离租户数据
- 可视化页面：在应用运行态的右上方，单击租户的下拉列表，切换为tenantB或tenantC。即可在tenantB和tenantC租户下，分别管理B公司和C公司在PDM应用下的模型数据。例如，[创建扩展模型的数据实体](https://support.huaweicloud.com/usermanual-idme/idme_clientog_0007.html)、[创建数据实例](https://support.huaweicloud.com/usermanual-idme/idme_clientog_0018.html)、[创建扩展属性](https://support.huaweicloud.com/usermanual-idme/idme_clientog_0050.html)等。
  图2切换租户   
  ![](https://support.huaweicloud.com/bestpractice-idme/figure/zh-cn_image_0000001880633768.png) 
- API方式：在待调用的API中为B公司和C公司添加"tenantid"必填参数。即，当B公司或者C公司对PDM应用进行增删改查操作时，发送的请求头必须带有tenantid。 请求头：
  ```
  POST http://{Endpoint}/rdm_{appID}_app/services/dynamic/api/{entityName}/{method}
  Content-Type: application/json
  Content-Length: Content Length
  X-AUTH-TOKEN: Token ID
  tenantid: 租户编码
  {
      "params": {
          "id": "唯一编码",
          ......
      }
  }
  ```
  其中，{Endpoint}表示数据建模引擎所在域名或IP地址，{appID}表示应用ID，{entityName}表示实体的英文名称，{method}表示请求方法。
  以在tenantB租户下创建单位类型为例，其请求示例如下：
  ```
  POST http://dme.cn-north-4.huaweicloud.com/rdm_01a2b2c4764d4e00f123g345fd9baa9f_app/services/dynamic/api/UnitType/create
  Content-Type: application/json
  Content-Length: Content Length
  X-AUTH-TOKEN: XXXXXXXXXX
  tenantid: tenantB
  {
      "params": {
          "id": "439166695949471744",
          "nameEn": "UnitTest",
          "name": "UnitTest",
          "descriptionEn": "",
          "descriptionCn": "",
          "unitGbFlag": true
      }
  }
  ```
  
 
#### 步骤3：隔离验证
如下操作以[步骤2：逻辑隔离租户数据]的创建单位类型为示例进行验证。
- 通过可视化页面方式验证。
  1. 在应用运行态的右上方，单击租户的下拉列表，选择"tenantB"。
  
  2. 在左侧导航栏中，选择"基础数据管理 \> 计量单位"，进入"计量单位"页面。 该页面下存在"UnitTest"的数据。
     
  
  3. 在应用运行态的右上方，单击租户的下拉列表，选择"tenantC"。
  
  4. 在左侧导航栏中，选择"基础数据管理 \> 计量单位"，进入"计量单位"页面。 该页面下无"UnitTest"的数据。
     
   
- 通过API方式调用单位类型的查询接口验证。
  - 发送请求头带有"tenantid"为"tenantB"的查询请求。
    ```
    POST http://dme.cn-north-4.huaweicloud.com/rdm_01a2b2c4764d4e00f123g345fd9baa9f_app/services/dynamic/api/UnitType/find/20/1 
    Content-Type: application/json 
    Content-Length: Content Length 
    X-AUTH-TOKEN: XXXXXXXXXX 
    tenantid: tenantB 
     
    { 
        "params": { 
            "sort": "DESC",
            "orderBy": "lastUpdateTime",
            "filter": {
                "joiner":"string",
                "conditions": []
            },
            "isNeedTotal": true
        } 
    }
    ```
    可查询到在"tenantB"租户下创建的单位类型。
    
  
  - 发送请求头带有"tenantid"为"tenantC"的查询请求。
    ```
    POST http://dme.cn-north-4.huaweicloud.com/rdm_01a2b2c4764d4e00f123g345fd9baa9f_app/services/dynamic/api/UnitType/find/20/1 
    Content-Type: application/json 
    Content-Length: Content Length 
    X-AUTH-TOKEN: XXXXXXXXXX 
    tenantid: tenantC 
     
    { 
        "params": { 
            "sort": "DESC",
            "orderBy": "lastUpdateTime",
            "filter": {
                "joiner":"string",
                "conditions": []
            },
            "isNeedTotal": true
        } 
    }
    ```
    查询不到在"tenantB"租户下创建的单位类型。
    
   
 
