6.4. 弃用了数据供应商和模型的方法
以前弃用的方法现在在 Red Hat build of Keycloak 中删除:
-
RealmModel=<searchForGroupByNameStream (String, Integer, Integer) -
UserProvider#getUsersStream (RealmModel, boolean) -
UserSessionPersisterProvider#loadUserSessions (int, int, boolean, int, String) -
添加了流化工作的接口,如
RoleMapperModel.Streams和类似 -
KeycloakModelUtils#getClientScopeMappings -
弃用的
KeycloakSession方法 -
UserQueryProvider#getUsersStream方法
另外,还会进行这些其他更改:
-
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. 更改了接口列表 复制链接链接已复制到粘贴板!
(O.k. 代表 org.keycloak. package)
server-spimodule-
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模块-
o.k.events.EventQuery -
o.k.events.admin.AdminEventQuery -
o.k.keys.KeyProvider
-
6.4.2. 在存储层中重构 复制链接链接已复制到粘贴板!
红帽 Keycloak 的构建进行大型重构,以简化 API 使用量,这会影响现有代码。其中一些更改需要更新现有代码。以下部分提供更详细的信息。
6.4.2.1. 模块结构的更改 复制链接链接已复制到粘贴板!
KeycloakSession 中存储功能的几个公共 API 已合并,一些已移动、已弃用或删除。引入了三个新模块,来自 server-spi、server-spi-private 和 services 模块的数据面向代码已在那里移动:
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 有 users ()、userLocalStorage ()、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, getClientStorageProviders and 已被删除。依赖于这些方法的代码应该按如下方式对实例进行广播:
getRoleStorageProviders Stream
迁移前:由于更改的 API,代码不会编译
realm.getClientStorageProvidersStream()...;
迁移后:将实例定向到旧接口
((LegacyRealmModel) realm).getClientStorageProvidersStream()...;
同样,用于实现接口 RealmModel 且希望提供这些方法的代码应实施新的 interface 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. 接口 UserCache 移到旧的模块 复制链接链接已复制到粘贴板!
由于对象的缓存状态对服务是透明的,因此接口 UserCache 已移到模块 keycloak-model-legacy 中。
依赖于旧实施的代码应该直接访问 UserCache。
迁移前:代码不会编译[source,java,subs="+quotes"]
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)();
迁移后: 使用 invalidation 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,在返回 UserModel 时,需要实施一个新的方法 credentialManager ()。它们必须返回 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);
}
};
}
}