
# 身份转换规则详细说明
联邦身份转换规则采用JSON格式呈现。您可以通过编辑JSON文件来修改规则。JSON格式如下：
```
[
          {
                    "local": [
                              {
                                        "<user> or <group> or <groups>"
                              }
                    ],
                    "remote": [
                              {
                                        "<condition>"
                              }
                    ]
          }
]
```
参数说明：
- local：表示联邦用户映射到IAM中的身份信息。可以是占位符"{0..n}"，{0}表示remote中用户信息的第一个属性，{1}表示remote中用户信息的第二个属性。
- remote：表示联邦用户在IdP中的用户信息，由断言属性及运算符组成的表达式，取值由断言决定。
  - condition：联邦用户映射到IAM时，身份转换规则的生效条件。当前支持三种条件：
    - empty：无限制，即条件一直生效，返回输入属性的值，值可以用于填充local块中的占位符。
    
    - any_one_of：输入属性值中只要包含一个指定值即生效，并返回布尔值，返回值不能用于local块中的占位符。
    
    - not_any_of：输入属性值中不包含任何指定值才生效，并返回布尔值，返回值不能用于local块中的占位符。
     
   
![](https://support.huaweicloud.com/usermanual-iam/public_sys-resources/notice_3.0-zh-cn.png)
映射到IAM中的用户身份信息只能包含：大小写字母、空格、数字或特殊字符（-_.）且不能以数字开头。
#### empty条件示例
empty条件的特点是能够返回一个具体字串值，该值用于填充local块中的占位符"{0..n}".
- 以下示例表示联邦用户在IAM中的用户名称为"remote"的第一个属性值+空格+第二个属性值，即*FirstName LastName* 。所属用户组为"remote"的第三个属性值，即*Group，Group* 属性的值只能有一个。
  ```
  [ 
          { 
              "local": [ 
                  { 
                      "user": { 
                          "name": "{0} {1}" 
                      } 
                  }, 
                  { 
                      "group": { 
                          "name": "{2}" 
                      } 
                  } 
              ], 
              "remote": [ 
                  { 
                      "type": "FirstName" 
                  }, 
                  { 
                      "type": "LastName" 
                  }, 
                  { 
                      "type": "Group" 
                  } 
              ] 
          } 
  ]
  ```
  假设传入以下断言，则联邦用户在IAM中的用户名为John Smith，John Smith在IAM中只属于"admin"用户组。（为了方便理解，简化了断言的结构，之后的示例也将做类似的简化，不再重复提示）
  ```
  {FirstName: John} 
  {LastName: Smith} 
  {Group: admin}
  ```
  
- 如果联邦用户需要在IAM中属于多个用户组，身份转换规则如下所示。 以下示例表示联邦用户在IAM中的用户名称为"remote"的第一个属性值+空格+第二个属性值，即*FirstName LastName* 。所属用户组为"remote"的第三个属性值，即*Groups*。
  ```
  [  
          {  
              "local": [  
                  {  
                      "user": {  
                          "name": "{0} {1}"  
                      }  
                  },  
                  {  
                      "group":   {  
                          "name": "{2}"  
                      }   
                  }  
              ],  
              "remote": [  
                  {  
                      "type": "FirstName"  
                  },  
                  {  
                      "type": "LastName"  
                  },  
                  {  
                      "type": "Groups"  
                  }  
              ]  
          }  
  ]
  ```
  假设传入以下断言，则联邦用户在系统中的用户名为John Smith，John Smith属于"admin"和"manager"用户组。
  ```
  {FirstName: John}  
  {LastName: Smith}  
  {Groups: [admin, manager]}
  ```
  
 
#### any one of、not any of条件示例
any one of、not any of与empty条件不同，这两个条件返回的是一个布尔值，该值不能用于填充local中的占位符。所以以下示例中，仅有一个占位符"{0}"用于被remote块中的第一个Empty条件填充，第二个group为一个固定的值admin。
- 以下示例表示联邦用户在IAM中的用户名为"remote"的第一个属性，即*UserName* 。所属用户组为"admin"。该规则仅对在IdP中属于"idp_admin"用户组的用户生效。
  ```
  [ 
          { 
              "local": [ 
                  { 
                      "user": { 
                          "name": "{0}" 
                      } 
                  }, 
                  { 
                      "group": { 
                          "name": "admin" 
                      } 
                  } 
              ], 
              "remote": [ 
                  { 
                  "type": "UserName" 
                  }, 
                  { 
                      "type": "Groups", 
                      "any_one_of": [ 
                          "idp_admin" 
                      ] 
                  } 
              ] 
          } 
  ]
  ```
  
- 如果联邦用户需要在IAM中属于多个用户组，身份转换规则如下所示。
  以下示例表示联邦用户在IAM中的用户名为"remote"的第一个属性，即UserName。所属用户组为"admin"和"manager"。该规则仅对在IdP中属于"idp_admin"用户组的用户生效。
  ```
  [  
          {  
              "local": [  
                  {  
                      "user": {  
                          "name": "{0}"  
                      }  
                  },  
                  {  
                      "group": {
                             "name":"admin"
                      }
                  },
                  {  
                      "group": {
                             "name":"manager"
                      }
                  }
              ],  
              "remote": [  
                  {  
                  "type": "UserName"  
                  },  
                  {  
                      "type": "Groups",  
                      "any_one_of": [  
                          "idp_admin"  
                      ]  
                  }  
              ]  
          }  
  ]
  ```
  - 假设传入以下断言，由于John Smith属于"idp_admin"用户组，所以允许该用户访问华为云。
    ```
    {UserName: John Smith} 
    {Groups: [idp_user, idp_admin, idp_agency]}
    ```
    
  
  - 假设传入以下断言，由于John Smith不属于"idp_admin"用户组，所以该规则对John Smith不生效，不允许John Smith访问华为云。
    ```
    {UserName: John Smith} 
    {Groups: [idp_user, idp_agency]}
    ```
    
    
 
#### 含有正则表达式的条件示例
您可以在条件里指定一个""regex": true"用来表示华为云将以正则匹配的方式来计算结果。
以下示例表示该规则对在IdP中用户组名以任意值开头，"@mail.com"结尾的用户生效，在IAM中的用户名为*UserName* ，所属用户组为"admin"。
```
[ 
        { 
            "local": [ 
                { 
                    "user": { 
                        "name": "{0}" 
                    } 
                }, 
                { 
                    "group": { 
                        "name": "admin" 
                    } 
                } 
            ], 
            "remote": [ 
                { 
                "type": "UserName" 
                }, 
                { 
                    "type": "Groups", 
                    "any_one_of": [ 
                        ".*@mail.com$" 
                    ], 
                    "regex": true 
                } 
            ] 
        } 
]
```
#### 条件组合示例
多个条件间，以"逻辑与"的方式组合。
以下示例表示该规则仅对既不属于IdP的"idp_user"也不属于IdP的"idp_agent"用户组的联邦用户生效。对于生效用户：在IAM中的用户名为*UserName* ，所属用户组为"admin"。
```
[ 
        { 
            "local": [ 
                { 
                    "user": { 
                        "name": "{0}" 
                    } 
                }, 
                { 
                    "group": { 
                        "name": "admin" 
                    } 
                } 
            ], 
            "remote": [ 
                { 
                "type": "UserName" 
                }, 
                { 
                    "type": "Groups", 
                    "not_any_of": [ 
                        "idp_user" 
                    ] 
                }, 
                { 
                    "type": "Groups", 
                    "not_any_of": [ 
                        "idp_agent" 
                    ] 
                } 
            ] 
        } 
]
```
以上规则等同于：
```
[ 
        { 
            "local": [ 
                { 
                    "user": { 
                        "name": "{0}" 
                    } 
                }, 
                { 
                    "group": { 
                        "name": "admin" 
                    } 
                } 
            ], 
            "remote": [ 
                { 
                "type": "UserName" 
                }, 
                { 
                    "type": "Groups", 
                    "not_any_of": [ 
                        "idp_user", 
                        "idp_agent" 
                    ] 
                } 
            ] 
        } 
]
```
#### 多个规则组合示例
多个规则组合，用户名与用户组生成方式不同。
用户名取第一个生效规则的用户名，所有规则中必须至少有一个用户名规则生效，否则华为云不允许此用户登录；而用户组则取所有生效规则用户组名称的集合。一种比较实用的多规则配置方式是把用户名配置与用户组配置分离。这样的配置会非常容易阅读。
以下示例表示针对IdP中属于"idp_admin"用户组的用户生效，在IAM中的用户名为*UserName*，所属用户组为"admin"。
```
[ 
    { 
        "local": [ 
            { 
                "user": { 
                    "name": "{0}" 
                } 
            } 
        ], 
        "remote": [ 
            { 
                "type": "UserName" 
            } 
        ] 
    }, 
    { 
        "local": [ 
            { 
                "group": { 
                    "name": "admin" 
                } 
            } 
        ], 
        "remote": [ 
            { 
                "type": "Groups", 
                "any_one_of": [ 
                    "idp_admin" 
                ] 
            } 
        ] 
    }
]
```
假设传入以下断言，由于John Smith属于"idp_admin"用户组，因此此规则对John Smith生效。在IAM中的用户名为John Smith，所属用户组为"admin"。
```
{UserName: John Smith} 
{Groups: [idp_user, idp_admin, idp_agency]}
```
