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 具有您可以实现支持同步的功能接口,但可能会快速变得困难且出现问题。

7.13.2. UserFederationProvider versus UserStorageProvider

首先要注意的是,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 方法现在封装在 CredentialInputValidatorCredentialInputUpdater 接口中,它们也是可选的,具体取决于您支持验证或更新凭证。用于存在于 UserModel 方法的凭证管理。它们也已移至 CredentialInputValidatorCredentialInputUpdater 接口。请注意,如果您没有实现 CredentialInputUpdater 接口,则您的供应商提供的任何凭证都可以在红帽构建的 Keycloak 存储本地覆盖。因此,如果您希望凭证为只读,请实施 CredentialInputUpdater.updateCredential () 方法并返回 ReadOnlyException

UserFederationProvider 查询方法,如 searchByAttributes ()getGroupMembers () 现在被封装在可选的 interface UserQueryProvider 中。如果没有实现这个接口,则无法在管理控制台中查看用户。但是,您仍可以登录。

早期 SPI 中的同步方法现在封装在可选的 ImportSynchronization 接口中。如果您实施了同步逻辑,则新的 UserStorageProviderFactory 实现了 ImportSynchronization 接口。

7.13.4. 升级至新模型

用户存储 SPI 实例存储在不同的关系表中。红帽构建的 Keycloak 会自动运行迁移脚本。如果为域部署任何较早的用户联邦供应商,它们将转换为后续存储模型,包括数据的 id。只有具有与早期用户联邦提供商相同的供应商 ID (即"ldap"、"kerberos")存在用户存储提供程序时,才会发生此迁移。

因此,您可以采取不同的方法。

  1. 您可以删除之前的 Red Hat build of Keycloak 部署中的供应商。这将删除您导入的所有用户的本地链接副本。然后,当您升级红帽构建的 Keycloak 时,只为您的域部署和配置新供应商。
  2. 第二个选项是编写新提供程序,确保它具有相同的供应商 ID: UserStorageProviderFactory.getId ()。确保此提供程序已部署到服务器。引导服务器,并让内置迁移脚本从较早的数据模型转换为后续的数据模型。在这种情况下,您之前所有链接的用户都可以正常工作,且相同。

如果您决定获得导入策略并重写您的用户存储供应商,我们建议您在升级 Red Hat build of Keycloak 前删除之前的供应商。这将删除您导入的任何用户的链接本地导入副本。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部