7.13. 从早期的用户联邦 SPI 迁移
只有在您使用之前(及现已删除)用户联邦 SPI 实施了供应商时,本章才适用。
在 Keycloak 版本 2.4.0 及更早版本中,有一个 User Federation SPI。Red Hat Single Sign-On 版本 7.0 也支持,但早期的 SPI 也可用。这个以前的 User Federation SPI 已从 Keycloak 版本 2.5.0 和 Red Hat Single Sign-On 版本 7.1 中删除。但是,如果您使用这个早期的 SPI 编写供应商,本章讨论了您可以用来端口它的一些策略。
7.13.1. 导入与非导入 复制链接链接已复制到粘贴板!
较早的用户联邦 SPI 要求您在 Red Hat build of Keycloak 的数据库中创建用户的本地副本,并将信息从外部存储导入到本地副本。但是,这不再是必需的。您仍然可以将较早的供应商移植为原样,但您应该考虑非导入策略是否为更好的方法。
导入策略的优点:
- 红帽构建的 Keycloak 基本上成为外部存储的持久性用户缓存。导入用户后,您将不会再达到外部存储,从而关闭它。
- 如果您要作为官方用户存储并弃用较早的外部存储红帽构建的 Keycloak,您可以慢慢地迁移应用程序以使用红帽构建的 Keycloak。所有应用迁移后,取消链接导入的用户,然后停用早期的传统外部存储。
使用导入策略时有一些明显的缺点:
- 第一次查找用户需要多次更新红帽构建的 Keycloak 数据库。这可能会给负载造成大量性能损失,并在红帽构建的 Keycloak 数据库中造成大量压力。用户联合存储方法将仅存储额外的数据,且可能永远不会根据外部存储的功能使用。
- 通过导入方法,您必须保留本地红帽构建的 Keycloak 存储和外部存储同步。用户存储 SPI 具有您可以实现支持同步的功能接口,但可能会快速变得困难且出现问题。
首先要注意的是,UserFederationProvider 是一个完整的接口。您在此界面中实施每个方法。但是,UserStorageProvider 会根据需要把这个接口分为多个您实现的功能接口。
UserFederationProvider.getUserByUsername () 和 getUserByEmail () 在新的 SPI 中具有完全对应的项。两者之间的差别在于您导入的方式。如果您要继续导入策略,您不再调用 KeycloakSession.userStorage ().addUser () 来在本地创建用户。相反,您调用 KeycloakSession.userLocalStorage ().addUser ()。userStorage () 方法不再存在。
UserFederationProvider.validateAndProxy () 方法已移至可选的功能接口 ImportedUserValidation。如果您要将早期供应商按原样移植,则需要实施此接口。另请注意,在之前的 SPI 中,每次访问用户时都会调用此方法,即使本地用户位于缓存中。在后续的 SPI 中,只有从本地存储加载本地用户时,才会调用此方法。如果缓存本地用户,则不会调用 ImportedUserValidation.validate () 方法。
后续 SPI 不再存在 UserFederationProvider.isValid () 方法。
UserFederationProvider 方法 synchronizeRegistrations (), registerUser (), 和 removeUser () 已移到 UserRegistrationProvider 功能接口。这个新接口是可选的,因此如果您的供应商不支持创建和删除用户,您不必实施它。如果您的之前的供应商已切换支持来注册新用户,新的 SPI 支持,如果供应商不支持添加用户,则从 UserRegistrationProvider.addUser () 返回 null。
以前基于凭证的 UserFederationProvider 方法现在封装在 CredentialInputValidator 和 CredentialInputUpdater 接口中,它们也是可选的,具体取决于您支持验证或更新凭证。用于存在于 UserModel 方法的凭证管理。它们也已移至 CredentialInputValidator 和 CredentialInputUpdater 接口。请注意,如果您没有实现 CredentialInputUpdater 接口,则您的供应商提供的任何凭证都可以在红帽构建的 Keycloak 存储本地覆盖。因此,如果您希望凭证为只读,请实施 CredentialInputUpdater.updateCredential () 方法并返回 ReadOnlyException。
UserFederationProvider 查询方法,如 searchByAttributes () 和 getGroupMembers () 现在被封装在可选的 interface UserQueryProvider 中。如果没有实现这个接口,则无法在管理控制台中查看用户。但是,您仍可以登录。
早期 SPI 中的同步方法现在封装在可选的 ImportSynchronization 接口中。如果您实施了同步逻辑,则新的 UserStorageProviderFactory 实现了 ImportSynchronization 接口。
7.13.4. 升级至新模型 复制链接链接已复制到粘贴板!
用户存储 SPI 实例存储在不同的关系表中。红帽构建的 Keycloak 会自动运行迁移脚本。如果为域部署任何较早的用户联邦供应商,它们将转换为后续存储模型,包括数据的 id。只有具有与早期用户联邦提供商相同的供应商 ID (即"ldap"、"kerberos")存在用户存储提供程序时,才会发生此迁移。
因此,您可以采取不同的方法。
- 您可以删除之前的 Red Hat build of Keycloak 部署中的供应商。这将删除您导入的所有用户的本地链接副本。然后,当您升级红帽构建的 Keycloak 时,只为您的域部署和配置新供应商。
-
第二个选项是编写新提供程序,确保它具有相同的供应商 ID:
UserStorageProviderFactory.getId ()。确保此提供程序已部署到服务器。引导服务器,并让内置迁移脚本从较早的数据模型转换为后续的数据模型。在这种情况下,您之前所有链接的用户都可以正常工作,且相同。
如果您决定获得导入策略并重写您的用户存储供应商,我们建议您在升级 Red Hat build of Keycloak 前删除之前的供应商。这将删除您导入的任何用户的链接本地导入副本。