6.4. データプロバイダーおよびモデルの非推奨メソッド
以前に非推奨となったいくつかのメソッドが、Red Hat build of Keycloak で削除されました。
-
RealmModel#searchForGroupByNameStream(String, Integer, Integer) -
UserProvider#getUsersStream(RealmModel, boolean) -
UserSessionPersisterProvider#loadUserSessions(int, int, boolean, int, String) -
Streamification 処理用に追加されたインターフェイス (
RoleMapperModel.Streamsなど) -
KeycloakModelUtils#getClientScopeMappings -
KeycloakSessionの非推奨メソッド -
UserQueryProvider#getUsersStreamメソッド
また、次のような他の変更も加えられました。
-
UserSessionProviderの一部のメソッドがUserLoginFailureProviderに移動しました。 -
フェデレーションストレージプロバイダークラスの
Streamsインターフェイスが非推奨になりました。 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. 変更されたインターフェイスのリスト リンクのコピーリンクがクリップボードにコピーされました!
(o.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モジュール-
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 が統合されました。その一部は移動、非推奨化、または削除されました。3 つの新しいモジュールが導入され、server-spi、server-spi-private、および services モジュールのデータ指向コードがそこに移動しました。
org.keycloak:keycloak-model-storage- ユーザーストレージ API などのストレージストアからの公開されている API がすべて含まれます。
org.keycloak:keycloak-model-storage-private-
ストレージの
*Managerクラスなど、ユーザーストレージ管理に関連するプライベート実装が含まれます。 org.keycloak:keycloak-model-storage-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();
session.userLocalStorage();
このポスト移行の例では、呼び出し元がストレージ API に依存しない場合の新規 API へのアクセスを示しています。
session.users();
session.users();
カスタムプロバイダーが特定のプロバイダーのモードを区別する必要がある場合、非推奨のオブジェクトへのアクセスは StoreManagers データストアプロバイダーを使用して提供されます。これに該当するのは、プロバイダーがローカルストレージに直接アクセスする場合や、プロバイダーがキャッシュをスキップする場合などです。このオプションは、ストレージモジュールがデプロイメントの一部である場合にのみ利用できます。
移行前のこの前の例は、削除された API へのアクセスを示しています。
session.userLocalStorage();
session.userLocalStorage();
この後移行の例では、StoreManagers API による新機能へのアクセスを示しています。
((DatastoreProvider) session.getProvider(DatastoreProvider.class)).userLocalStorage();
((DatastoreProvider) session.getProvider(DatastoreProvider.class)).userLocalStorage();
一部のユーザーストレージ関連の API は、便宜上 org.keycloak.storage.UserStorageUtil にラップされています。
6.4.4. RealmModel への変更 リンクのコピーリンクがクリップボードにコピーされました!
メソッド getUserStorageProviders、getUserStorageProvidersStream、getClientStorageProviders、getClientStorageProvidersStream、getRoleStorageProviders、および 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. UserCache インターフェイスがレガシーモジュールに移動 リンクのコピーリンクがクリップボードにコピーされました!
オブジェクトのキャッシュステータスがサービスに対して透過的であるため、インターフェイス UserCache はモジュール keycloak-storage-legacy に移動しました。
レガシー実装に依存するコードは、UserCache に直接アクセスする必要があります。
これは、移行コードの例になります。これは、移行コードの例はコンパイルされません。
session.userCache().evict(realm, user);
session.userCache().evict(realm, user);
この移行の例には、API を直接使用することが示されています。
UserStorageUitl.userCache(session);
UserStorageUitl.userCache(session);
レルムの無効化をトリガーするには、UserCache API を使用する代わりに、イベントをトリガーすることを検討してください。
これは、移行コードの例ではキャッシュ API を使用する前です。
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().method(realm, user, ...) を使用して管理されていました。新しい方法では、user.credentialManager().method(...) を使用します。この形式は、認証情報の機能をユーザーの 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 の場合、UserModel を返すときに、新しいメソッド credentialManager() を実装する必要があります。これらは UserCredentialManager のインスタンスを返す必要があります。
これは、移行コードの例より前で、UserModel で必要な新しいメソッド credentialManager () が原因でコンパイルされません。
このポスト移行の例は、ストアの API UserModel.credentialManager () の実装を示しています。