联邦用户身份转换规则说明
[ { "remote": [ { "<condition>" } ], "local": [ { "<user> or <group> or <groups>" } ] } ]
- remote:表示联邦用户在IdP中的用户信息,由断言属性及运算符组成的表达式,取值由断言决定。
- condition:表示联邦用户映射到系统中的身份转换规则。当前支持三种条件:
- empty:无限制,即条件一直生效,返回输入属性的值,值可以用于填充local块中的占位符。
- any_one_of:输入属性值中只要包含一个指定值即生效,并返回布尔值,返回值不能用于local块中的占位符。
- not_any_of:输入属性值中不包含任何指定值才生效,并返回布尔值,返回值不能用于local块中的占位符。
- local:表示联邦用户在系统中的用户信息。可以是占位符“{0..n}”,{0}表示remote中用户信息的第一个属性,{1}表示remote中用户信息的第二个属性。
规则条件示例
通过示例来加深您对身份转换规则条件(empty、any_one_of、not_any_of)的理解。
- empty:该条件的特点是能够返回一个具体字串值,该值用于填充local块中的占位符“{0..n}”,如下所示。
[ { "local": [ { "user": { "name": "{0} {1}" } }, { "group": { "name": "{2}" } } ], "remote": [ { "type": "FirstName" }, { "type": "LastName" }, { "type": "Group" } ] } ]
表示联邦用户在系统中的用户名称为“remote”的第一个属性值+空格+第二个属性值,即FirstName LastName。所属用户组为“remote”的第三个属性值,即Group,Group属性的值只能有一个。
假设传入以下断言(为了方便理解,简化了断言的结构,之后的示例也将做类似的简化,不再重复提示),则联邦用户在系统中的用户名为John Smith,John Smith在系统中只属于“admin”用户组。
{FirstName: John} {LastName: Smith} {Groups: admin}
如果联邦用户需要在系统中属于多个用户组,身份转换规则如下所示。
[ { "local": [ { "user": { "name": "{0} {1}" } }, { "groups": "{2}" } ], "remote": [ { "type": "FirstName" }, { "type": "LastName" }, { "type": "Groups" } ] } ]
表示联邦用户在系统中的用户名称为“remote”的第一个属性值+空格+第二个属性值,即FirstName LastName。所属用户组为“remote”的第三个属性值,即Groups。
假设传入以下断言,则联邦用户在系统中的用户名为John Smith,John Smith属于“admin”和“manager”用户组。
{FirstName: John} {LastName: Smith} {Groups: [admin, manager]}
- any one of、not any of:与Empty条件不同,这两个条件返回的是一个布尔值,该值不能用于填充local中的占位符。所以以下示例中,仅有一个占位符“{0}”用于被remote块中的第一个Empty条件填充,第二个group为一个固定的值admin。
[ { "local": [ { "user": { "name": "{0}" } }, { "group": { "name": "admin" } } ], "remote": [ { "type": "UserName" }, { "type": "Groups", "any_one_of": [ "idp_admin" ] } ] } ]
表示联邦用户在系统中的用户名为“remote”的第一个属性,即UserName。所属用户组为“admin”。该规则仅对在IdP中属于“idp_admin”用户组的用户生效。
如果联邦用户需要在系统中属于多个用户组,身份转换规则如下所示。
[ { "local": [ { "user": { "name": "{0}" } }, { "groups": "[\"admin\",\"manager\"]" } ], "remote": [ { "type": "UserName" }, { "type": "Groups", "any_one_of": [ "idp_admin" ] } ] } ]
表示联邦用户在系统中的用户名为“remote”的第一个属性,即UserName。所属用户组为“admin”和“manager”。该规则仅对在IdP中属于“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 } ] } ]
表示该规则对以任意值开头,“@mail.com”结尾的用户生效,在系统中的用户名为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" ] } ] } ]
表示该规则仅对既不属于IdP的“idp_user”也不属于IdP的“idp_agent”用户组的联邦用户生效。对于生效用户:在系统中的用户名为UserName,所属用户组为“admin”。以上规则等同于:
[ { "local": [ { "user": { "name": "{0}" } }, { "group": { "name": "admin" } } ], "remote": [ { "type": "UserName" }, { "type": "Groups", "not_any_of": [ "idp_user", "idp_agent" ] } ] } ]
- 多规则
用户名取第一个生效规则的用户名,所有规则中必须至少有一个用户名规则生效,否则系统不允许此用户登录;而用户组则取所有生效规则用户组名称的集合。
一种比较实用的多规则配置方式是把用户名配置与用户组配置分离。这样的配置会非常容易阅读。
[ { "local": [ { "user": { "name": "{0}" } } ], "remote": [ { "type": "UserName" } ] }, { "local": [ { "group": { "name": "admin" } } ], "remote": [ { "type": "Groups", "any_one_of": [ "idp_admin" ] } ] } ]
表示针对IdP中属于“idp_admin”用户组的用户生效,在系统中的用户名为UserName,所属用户组为“admin”。
假设传入以下断言,由于John Smith属于“idp_admin”用户组,因此此规则对John Smith生效。在系统中的用户名为John Smith,所属用户组为“admin”。
{UserName: John Smith} {Groups: [idp_user, idp_admin, idp_agency]}