身份转换规则详细说明
[ { "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块中的占位符。
- condition:联邦用户映射到IAM时,身份转换规则的生效条件。当前支持三种条件:
映射到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]}
- 假设传入以下断言,由于John Smith属于“idp_admin”用户组,所以允许该用户访问华为云。
含有正则表达式的条件示例
您可以在条件里指定一个“"regex": true”用来表示华为云将以正则匹配的方式来计算结果。
[ { "local": [ { "user": { "name": "{0}" } }, { "group": { "name": "admin" } } ], "remote": [ { "type": "UserName" }, { "type": "Groups", "any_one_of": [ ".*@mail.com$" ], "regex": true } ] } ]
条件组合示例
多个条件间,以“逻辑与”的方式组合。
[ { "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]}