添加模式版本和在映射规则中对 domain 属性的支持

此规范引入了对映射规则中“domain”属性的支持,并为身份联合部署中使用的属性映射模式添加了一种版本控制方法。

bug #1887515

此规范实现了一种替代方案,用于在 [1] 中提出的版本控制映射。

问题描述

当前,Keystone 身份提供程序 (IdP) 属性映射模式仅将“domain”属性映射作为映射组的域的默认配置;组可以通过设置其特定域来覆盖默认属性映射域。然而,还有其他“元素”,例如用户和项目,它们也可以拥有一个域来定义它们在 OpenStack 中的位置。

当操作员读取属性映射部分并查看属性映射定义的模式时,可能会认为映射中定义的域也将适用于用户和项目。然而,事实并非如此。

文档中的示例 [2] 并没有涵盖所有用例。因此,有些人可能会直接查看代码,并检查模式定义以了解可以定义哪些映射。然后,操作员可能会看到在 local 规则的根目录下,我们有一个域定义 [3]。该选项也适用于 usergroup 属性。因此,人们可能会认为这些可以用作覆盖,而这个 ([3]) 是映射规则的默认值。然而,代码的实现方式并非如此。

提议的变更

首先,为了促进 IdP 属性映射的开发和扩展,我们改变了处理属性映射模式的方式。我们引入了一个新的选项,称为 schema_version,其默认值为“1.0”。此属性映射模式版本将用于控制属性映射的验证,以及用于处理来自 IdP 的属性的规则处理器。到目前为止,通过此补丁,我们引入了对属性映射模式“2.0”的支持,这使得操作员也可以定义他们想要分配用户的项目的域。如果项目或属性映射的全局域定义中都没有定义域,我们将 IdP 域作为默认值。

因此,我们扩展了 Keystone 身份提供程序 (IdP) 属性映射模式,以使 Keystone 尊重其上的 domain 配置。当前,该配置仅用于为组定义默认域(然后每个组可以覆盖它)。将此配置扩展到也应用于用户和项目是有意义的(只要它位于属性映射的根目录下)。

属性映射模式

当前在 keystone/federation/utils.py 中定义的模式没有属性来保存正在定义的规则的模式版本。因此,我们也会在那里引入一个新的属性,称为 schema_version。这个新属性将是一个字符串,用于保存映射规则模式版本。

然后使用映射规则模式版本来定义用于处理属性映射规则 JSON 的处理器。

在提议的更改之前,可以创建如下映射(以下映射仅为示例;还有许多其他可能性)

{
  "mapping": {
    "rules": [
      {
        "remote": [
          {
            "type": "OIDC-preferred_username"
          },
          {
            "type": "OIDC-email"
          },
          {
            "type": "OIDC-openstack-user-domain"
          },
          {
            "type": "OIDC-openstack-project-name"
          }
        ],
        "local": [
          {
            "domain": {
              "name": "{2}"
            },
            "user": {
              "domain": {
                "name": "{2}"
              },
              "type": "ephemeral",
              "email": "{1}",
              "name": "{0}"
            },
            "projects": [
              {
              "domain": {
                "name": "{2}"
                },
                "name": "{3}",
                "roles": [
                  {
                    "name": "member"
                  }
                ]
              }
            ]
          }
        ]
      }
    ],
    "links": {
      "self": "http://<keystone_server>/v3/OS-FEDERATION/mappings/<attribute_mapping_id>"
    },
    "id": "<attribute_mapping_id>",
  }
}

在提议的更改之后,例如,可以使用以下属性映射。现在我们能够在映射的根目录下仅声明域,然后它将在所有其他具有它的元素中重用。此外,可以为特定对象覆盖它。

{
  "mapping": {
    "rules": [
      {
        "remote": [
          {
            "type": "OIDC-preferred_username"
          },
          {
            "type": "OIDC-email"
          },
          {
            "type": "OIDC-openstack-user-domain"
          },
          {
            "type": "OIDC-openstack-extra-project-domain"
          },
          {
            "type": "OIDC-openstack-project-name"
          },
          {
            "type": "OIDC-openstack-extra-project-name"
          }
        ],
        "local": [
          {
            "domain": {
              "name": "{2}"
            },
            "user": {
              "type": "ephemeral",
              "email": "{1}",
              "name": "{0}"
            },
            "projects": [
              {
                "name": "{4}",
                "roles": [
                  {
                    "name": "member"
                  }
                ]
              },
              {
                "domain": {
                  "name": "{3}"
                  },
                "name": "{5}",
                "roles": [
                    {
                      "name": "member"
                    }
                  ]
                }
              ]
            }
          ]
        }
      ],
      "links": {
        "self": "http://<keystone_server>/v3/OS-FEDERATION/mappings/<attribute_mapping_id>"
      },
      "id": "<attribute_mapping_id>",
      "schema_version": "2.0"
    }
  }

验证

我们将对照所有现有/可能的字段版本验证 schema_version。因此,如果它不在已经定义的版本范围内,则会抛出错误。

如果未提供 schema_version,则使用的版本为 1.0

数据库表更改

当前,“mapping”表定义为

+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | varchar(64) | NO   | PRI | NULL    |       |
| rules | text        | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

我们将向其中添加一个新字段。因此,它将如下所示

+----------------+-------------+------+-----+----------+-------+
| Field          | Type        | Null | Key | Default  | Extra |
+----------------+-------------+------+-----+----------+-------+
| id             | varchar(64) | NO   | PRI | NULL     |       |
| rules          | text        | NO   |     | NULL     |       |
| schema_version | varchar(5)  | NO   |     | '1.0'    |       |
+----------------+-------------+------+-----+----------+-------+

API 影响

  • 将提供一个新的属性 schema_version。它默认为 1.0

  • 属性 groupsprojectsuser 都接受 domain 的定义,该定义会覆盖在映射规则的根目录中定义的可选 domain。如果这些对象没有定义域,则采用映射规则根目录中指定的域。如果映射规则的根目录中也没有定义域,则使用 IdP 域。

负责人

主要负责人

其他贡献者

工作项

  1. 在 Keystone 中实现提议的更改 [4]

  • 创建新的映射模式

  • 创建用于提议的更改的新处理器

  • 实现验证和单元测试

  • Update documentation

依赖项

参考资料