7.13. 从以前的用户联邦 SPI 迁移
只有在使用之前(并已被删除)用户 Federation 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. 导入而不是非导入 复制链接链接已复制到粘贴板!
之前的用户 Federation SPI 要求您在红帽构建的 Keycloak 数据库中创建用户的本地副本,并将信息从外部存储导入到本地副本。但是,这不再是必需的。您仍然可以按原样方式移植之前的供应商,但您应该考虑非重要策略是否是更好的方法。
导入策略的优点:
- 红帽构建的 Keycloak 基本上成为外部存储的持久性用户缓存。用户导入后,您将不再按外部存储,从而关闭它。
- 如果您要以您的官方用户存储和弃用早期的外部存储迁移到 Red Hat build of Keycloak,您可以缓慢迁移应用程序以使用红帽构建的 Keycloak。迁移所有应用程序时,取消链接导入的用户,并停用较早的传统外部存储。
使用导入策略有一些明显的缺点:
- 第一次查找用户将需要对红帽构建的 Keycloak 数据库进行多次更新。这可能会因为负载造成大量性能损失,并在红帽构建的 Keycloak 数据库上造成大量压力。用户联邦存储方法将仅根据需要存储额外的数据,且可能不得根据外部存储的功能使用。
- 通过导入方法,您必须保持本地红帽构建的 Keycloak 存储和外部存储同步。用户存储 SPI 具有可用于支持同步的功能接口,但这可能会快速实现。
7.13.2. UserFederationProvider 和 UserStorageProvider 复制链接链接已复制到粘贴板!
首先要注意到的是 UserFederationProvider 是一个完整的接口。在此界面中实施了每种方法。但是,UserStorageProvider 已将这个接口分成您根据需要实现的多个功能接口。
UserFederationProvider.getUserByUsername () 和 getUserByEmail () 在新的 SPI 中完全匹配。两者之间的区别在于如何导入。如果您要继续导入策略,您将不再调用 KeycloakSession.userStorage ().addUser () 来在本地创建用户。相反,您可以调用 KeycloakSession.userLocalStorage ().addUser ()。userStorage () 方法不再存在。
UserFederationProvider.validateAndProxy () 方法已移到可选的功能接口 ImportedUserValidation 中。如果您要按预期移植以前的供应商,则需要实施此接口。另请注意,在之前的 SPI 中,这个方法在每次用户访问时都会被调用,即使本地用户位于缓存中。在后续的 SPI 中,只有本地用户从本地存储加载时,才会调用此方法。如果本地用户被缓存,则不会调用 ImportedUserValidation.validate () 方法。
UserFederationProvider.isValid () 方法在以后的 SPI 中不再存在。
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")的用户存储供应商时,才会进行此迁移。
因此,您可以采取不同的方法。
- 您可以在以前的红帽构建的 Keycloak 部署中删除早期的供应商。这将删除您导入的所有用户的本地链接副本。然后,当您升级红帽构建的 Keycloak 时,只需为您的域部署和配置新供应商。
-
第二个选项是编写您的新提供程序,确保其具有相同的供应商 ID:
UserStorageProviderFactory.getId ()。确保此提供程序已部署到服务器。引导服务器,并让内置迁移脚本从以前的数据模型转换为更新的数据模型。在这种情况下,您之前导入的所有用户都将正常工作,并且是相同的。
如果您已决定导入策略并重写您的用户存储供应商,建议您在升级红帽构建的 Keycloak 前删除之前的供应商。这将删除您导入的任何用户的链接本地导入副本。