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 方法现在封装在 CredentialInputValidator 和 CredentialInputUpdater 接口中,它们也是可选的,具体取决于您支持验证或更新凭证。用于存在于 UserModel 方法的凭证管理。它们也已移至 CredentialInputValidator 和 CredentialInputUpdater 接口。请注意,如果您没有实现 CredentialInputUpdater 接口,则您的供应商提供的任何凭证都可以在红帽构建的 Keycloak 存储本地覆盖。因此,如果您希望凭证为只读,请实施 CredentialInputUpdater.updateCredential () 方法并返回 ReadOnlyException。
UserFederationProvider 查询方法,如 searchByAttributes () 和 getGroupMembers () 现在被封装在可选的 interface UserQueryProvider 中。如果没有实现这个接口,则无法在管理控制台中查看用户。但是,您仍可以登录。