搜索

6.4. 弃用了来自数据供应商和模型的方法

download PDF

现在,一些已弃用的方法已在 Red Hat build of Keycloak 中删除:

  • RealmModel SerialsearchForGroupByNameStream (String, Integer, Integer)
  • UserProvider"getUsersStream (RealmModel, boolean)
  • UserSessionPersisterProvider SerialloadUserSessions (int, int, boolean, int, String)
  • 为流化添加的接口,如 RoleMapperModel.Streams 和类似
  • KeycloakModelUtils#getClientScopeMappings
  • 弃用了 KeycloakSession的方法
  • UserQueryProviderRHACMgetUsersStream 方法

另外,还会进行这些其他更改:

  • 来自 UserSessionProvider 的一些方法被移到 UserLoginFailureProvider 中。
  • 联合存储供应商类中的流接口已弃用。
  • Streamification - 接口现在只包含基于流的方法。

    例如在 GroupProvider 接口中

    @Deprecated
    List<GroupModel> getGroups(RealmModel realm);

    被替换

    Stream<GroupModel> getGroupsStream(RealmModel realm);
  • 一致参数排序 - 方法现在具有严格的参数排序,其中 RealmModel 始终是第一个参数。

    例如,在 UserLookupProvider 接口:

    @Deprecated
    UserModel getUserById(String id, RealmModel realm);

    被替换

    UserModel getUserById(RealmModel realm, String id)

6.4.1. 更改的接口列表

(p.k. 代表 org.keycloak. 软件包)

  • server-spi 模块

    • o.k.credential.CredentialInputUpdater
    • o.k.credential.UserCredentialStore
    • o.k.models.ClientProvider
    • o.k.models.ClientSessionContext
    • o.k.models.GroupModel
    • o.k.models.GroupProvider
    • o.k.models.KeyManager
    • o.k.models.KeycloakSessionFactory
    • o.k.models.ProtocolMapperContainerModel
    • o.k.models.RealmModel
    • o.k.models.RealmProvider
    • o.k.models.RoleContainerModel
    • o.k.models.RoleMapperModel
    • o.k.models.RoleModel
    • o.k.models.RoleProvider
    • o.k.models.ScopeContainerModel
    • o.k.models.UserCredentialManager
    • o.k.models.UserModel
    • o.k.models.UserProvider
    • o.k.models.UserSessionProvider
    • o.k.models.utils.RoleUtils
    • o.k.sessions.AuthenticationSessionProvider
    • o.k.storage.client.ClientLookupProvider
    • o.k.storage.group.GroupLookupProvider
    • o.k.storage.user.UserLookupProvider
    • o.k.storage.user.UserQueryProvider
  • server-spi-private module

    • o.k.events.EventQuery
    • o.k.events.admin.AdminEventQuery
    • o.k.keys.KeyProvider

6.4.2. 在存储层中重新考虑

Red Hat build of Keycloak 进行大型重构,以简化 API 的使用,这会影响现有代码。其中一些更改需要更新现有代码。以下部分详细介绍了。

6.4.2.1. 模块结构的更改

围绕 KeycloakSession 中的存储功能的几个公共 API 已合并,一些已被移动、弃用或删除。引入了三个新模块,并且从 server-spi、 server-spi -privateservices 模块中面向数据的代码已移动:

org.keycloak:keycloak-model-legacy
包含来自旧存储的所有面向公共的 API,如 User Storage API。
org.keycloak:keycloak-model-legacy-private
包含与用户存储管理相关的私有实现,如 storage *Manager 类。
org.keycloak:keycloak-model-legacy-services
包含所有直接在传统存储上操作的 REST 端点。

如果您在自定义用户存储供应商中使用示例,则实施已移至新模块的类,您需要更新依赖项使其包含上面列出的新模块。

6.4.2.2. KeycloakSession中的更改

KeycloakSession 已简化。KeycloakSession 中删除了多种方法。

KeycloakSession 会话包含多种获取特定对象类型的提供程序的方法,如 UserProvider,有 usersProvider、userLocalStorage () 、userCache ()、userCache ()userStorageManager ()userFederatedStorage ()。对于必须了解每种方法完全相同的含义的开发人员,这种情形可能会造成混淆。

因此,只有 users () 方法保存在 KeycloakSession 中,并且应替换上面列出的所有其他调用。删除了其余方法。相同的模式适用于其他对象区域的方法,如 clients ()groups ()。以 *StorageManager ()*LocalStorage () 结尾的所有方法均已被删除。下面的部分论述了如何将这些调用迁移到新 API,或使用旧的 API。

6.4.3. 迁移现有供应商

如果没有调用删除的方法,则现有供应商不需要迁移,这应该是大多数供应商的情况。

如果提供商使用删除的方法,但不依赖于本地存储与非本地存储,则将调用从现在删除的 userLocalStorage () 更改为方法 users () 是最佳选择。请注意,如果本地设置中已启用,则语义更改在此处,因为新方法涉及缓存。

在迁移前:访问删除的 API 不会编译

session.userLocalStorage();

迁移后: 当调用者不依赖于旧的存储 API 时访问新的 API

session.users();

在个别情况下,当自定义供应商需要区分特定提供程序的模式时,使用 LegacyStoreManagers 数据存储提供程序提供对已弃用对象的访问。如果提供商直接访问本地存储或希望跳过缓存,则可能会出现这种情况。只有在旧模块是部署的一部分时,此选项才可用。

在迁移前:访问已删除的 API

session.userLocalStorage();

迁移后:通过 LegacyStoreManagers API 访问新功能

((LegacyDatastoreProvider) session.getProvider(DatastoreProvider.class)).userLocalStorage();

为方便起见,一些用户存储相关的 API 已被嵌套在 org.keycloak.storage.UserStorageUtil 中。

6.4.4. 更改为 RealmModel

方法 getUserStorageProviders,getUserStorageProvidersStream,getClientStorageProviders,getClientStorageProvidersStream,getRoleStorageProviders Streams 和 getRoleStorageProvidersStream 已被删除。依赖于这些方法的代码应广播实例,如下所示:

迁移前:因为更改的 API,代码不会编译

realm.getClientStorageProvidersStream()...;

迁移后:将实例转换为旧接口

((LegacyRealmModel) realm).getClientStorageProvidersStream()...;

同样,用于实现接口 RealmModel 并希望提供这些方法的代码应该实施新的接口 LegacyRealmModel。这个接口是 RealmModel 的子接口,包括旧方法:

迁移前:代码实现旧接口

public class MyClass extends RealmModel {
    /* might not compile due to @Override annotations for methods no longer present
       in the interface RealmModel. / / ... */
}

迁移后:代码实现新接口

public class MyClass extends LegacyRealmModel {
    /* ... */
}

6.4.5. Interface UserCache 移到旧的模块

由于对象的缓存状态对服务是透明的,因此接口 UserCache 已移到模块 keycloak-model-legacy 中。

依赖于传统实施的代码应直接访问 UserCache

在迁移前:代码不会编译[source,java,subs="+ quote"]

session**.userCache()**.evict(realm, user);

迁移后:直接使用 API

UserStorageUitl.userCache(session);

要触发域的无效,而不是使用 UserCache API,请考虑触发事件:

在迁移前:代码使用 cache API[source,java,subs="+ quotes"]

UserCache cache = session.getProvider(UserCache.class);
if (cache != null) cache.evict(realm)();

迁移后:使用无效 API

session.invalidate(InvalidationHandler.ObjectType.REALM, realm.getId());

6.4.6. 用户的凭证管理

用户凭证之前使用 session.userCredentialManager ().方法(realm、user、...) 进行管理。新方法是利用 user.credentialManager ().方法(...)。这种形式使凭证功能更接近用户 API,不依赖于用户凭据对域和存储相关的位置。

旧的 API 已被移除。

在迁移前:访问已删除的 API

session.userCredentialManager().createCredential(realm, user, credentialModel)

迁移后:访问新的 API

user.credentialManager().createStoredCredential(credentialModel)

对于自定义 UserStorageProvider,有一个新的方法 credentialManager (),需要在返回 UserModel 时实施。它们必须返回 LegacyUserCredentialManager 实例:

迁移前:因为 UserModel需要的新方法 credentialManager (),代码不会被编译

public class MyUserStorageProvider implements UserLookupProvider, ... {
    /* ... */
    protected UserModel createAdapter(RealmModel realm, String username) {
        return new AbstractUserAdapter(session, realm, model) {
            @Override
            public String getUsername() {
                return username;
            }
        };
    }
}

迁移后:为传统存储实施 API UserModel.credentialManager ()

public class MyUserStorageProvider implements UserLookupProvider, ... {
    /* ... */
    protected UserModel createAdapter(RealmModel realm, String username) {
        return new AbstractUserAdapter(session, realm, model) {
            @Override
            public String getUsername() {
                return username;
            }

            @Override
            public SubjectCredentialManager credentialManager() {
                return new LegacyUserCredentialManager(session, realm, this);
            }
        };
    }
}

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.