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

联邦用户身份转换规则说明

联邦身份转换规则采用JSON文件格式呈现。您可以通过编辑JSON文件来修改规则。JSON格式如下:
[ 
        { 
            "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]}
  • 含有正则表达式的条件:你可以在条件里指定一个“"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]}