添加模式版本和在映射规则中对 domain 属性的支持¶
此规范引入了对映射规则中“domain”属性的支持,并为身份联合部署中使用的属性映射模式添加了一种版本控制方法。
此规范实现了一种替代方案,用于在 [1] 中提出的版本控制映射。
问题描述¶
当前,Keystone 身份提供程序 (IdP) 属性映射模式仅将“domain”属性映射作为映射组的域的默认配置;组可以通过设置其特定域来覆盖默认属性映射域。然而,还有其他“元素”,例如用户和项目,它们也可以拥有一个域来定义它们在 OpenStack 中的位置。
当操作员读取属性映射部分并查看属性映射定义的模式时,可能会认为映射中定义的域也将适用于用户和项目。然而,事实并非如此。
文档中的示例 [2] 并没有涵盖所有用例。因此,有些人可能会直接查看代码,并检查模式定义以了解可以定义哪些映射。然后,操作员可能会看到在 local 规则的根目录下,我们有一个域定义 [3]。该选项也适用于 user 和 group 属性。因此,人们可能会认为这些可以用作覆盖,而这个 ([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。
属性 groups、projects 和 user 都接受 domain 的定义,该定义会覆盖在映射规则的根目录中定义的可选 domain。如果这些对象没有定义域,则采用映射规则根目录中指定的域。如果映射规则的根目录中也没有定义域,则使用 IdP 域。
负责人¶
- 主要负责人
Rafael <rafael@apache.org>
其他贡献者
工作项¶
在 Keystone 中实现提议的更改 [4]
创建新的映射模式
创建用于提议的更改的新处理器
实现验证和单元测试
Update documentation
依赖项¶
无