6.4. 弃用了来自数据供应商和模型的方法
现在,一些已弃用的方法已在 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);
@Deprecated List<GroupModel> getGroups(RealmModel realm);
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 被替换
Stream<GroupModel> getGroupsStream(RealmModel realm);
Stream<GroupModel> getGroupsStream(RealmModel realm);
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 一致参数排序 - 方法现在具有严格的参数排序,其中
RealmModel
始终是第一个参数。例如,在
UserLookupProvider
接口:@Deprecated UserModel getUserById(String id, RealmModel realm);
@Deprecated UserModel getUserById(String id, RealmModel realm);
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 被替换
UserModel getUserById(RealmModel realm, String id)
UserModel getUserById(RealmModel realm, String id)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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、
、userCache ()、userLocalStorage ()
userCache ()
、userStorageManager ()
和 userFederatedStorage ()
。对于必须了解每种方法完全相同的含义的开发人员,这种情形可能会造成混淆。
因此,只有 users ()
方法保存在 KeycloakSession
中,并且应替换上面列出的所有其他调用。删除了其余方法。相同的模式适用于其他对象区域的方法,如 clients ()
或 groups ()
。以 *StorageManager ()
和 *LocalStorage ()
结尾的所有方法均已被删除。下面的部分论述了如何将这些调用迁移到新 API,或使用旧的 API。
6.4.3. 迁移现有供应商 复制链接链接已复制到粘贴板!
如果没有调用删除的方法,则现有供应商不需要迁移,这应该是大多数供应商的情况。
如果提供商使用删除的方法,但不依赖于本地存储与非本地存储,则将调用从现在删除的 userLocalStorage ()
更改为方法 users ()
是最佳选择。请注意,如果本地设置中已启用,则语义更改在此处,因为新方法涉及缓存。
在迁移前:访问删除的 API 不会编译
session.userLocalStorage();
session.userLocalStorage();
迁移后: 当调用者不依赖于旧的存储 API 时访问新的 API
session.users();
session.users();
在个别情况下,当自定义供应商需要区分特定提供程序的模式时,使用 LegacyStoreManagers
数据存储提供程序提供对已弃用对象的访问。如果提供商直接访问本地存储或希望跳过缓存,则可能会出现这种情况。只有在旧模块是部署的一部分时,此选项才可用。
在迁移前:访问已删除的 API
session.userLocalStorage();
session.userLocalStorage();
迁移后:通过 LegacyStoreManagers API 访问新功能
((LegacyDatastoreProvider) session.getProvider(DatastoreProvider.class)).userLocalStorage();
((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()...;
realm.getClientStorageProvidersStream()...;
迁移后:将实例转换为旧接口
((LegacyRealmModel) 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 RealmModel {
/* might not compile due to @Override annotations for methods no longer present
in the interface RealmModel. / / ... */
}
迁移后:代码实现新接口
public class MyClass extends LegacyRealmModel { /* ... */ }
public class MyClass extends LegacyRealmModel {
/* ... */
}
6.4.5. Interface UserCache 移到旧的模块 复制链接链接已复制到粘贴板!
由于对象的缓存状态对服务是透明的,因此接口 UserCache
已移到模块 keycloak-model-legacy
中。
依赖于传统实施的代码应直接访问 UserCache
。
在迁移前:代码不会编译[source,java,subs="+ quote"]
session**.userCache()**.evict(realm, user);
session**.userCache()**.evict(realm, user);
迁移后:直接使用 API
UserStorageUitl.userCache(session);
UserStorageUitl.userCache(session);
要触发域的无效,而不是使用 UserCache
API,请考虑触发事件:
在迁移前:代码使用 cache API[source,java,subs="+ quotes"]
UserCache cache = session.getProvider(UserCache.class); if (cache != null) cache.evict(realm)();
UserCache cache = session.getProvider(UserCache.class);
if (cache != null) cache.evict(realm)();
迁移后:使用无效 API
session.invalidate(InvalidationHandler.ObjectType.REALM, realm.getId());
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)
session.userCredentialManager().createCredential(realm, user, credentialModel)
迁移后:访问新的 API
user.credentialManager().createStoredCredential(credentialModel)
user.credentialManager().createStoredCredential(credentialModel)
对于自定义 UserStorageProvider
,有一个新的方法 credentialManager ()
,需要在返回 UserModel
时实施。它们必须返回 LegacyUserCredentialManager
实例:
迁移前:因为 UserModel
需要的新方法 credentialManager ()
,代码不会被编译
迁移后:为传统存储实施 API UserModel.credentialManager ()
。