更新时间:2024-04-23 GMT+08:00

身份转换规则详细说明

联邦身份转换规则采用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块中的占位符。

映射到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]}