第6章 SPI (サービスプロバイダーインターフェイス)
Red Hat Single Sign-On は、カスタムコードを必要とせずにほとんどのユースケースに対応するように設計されていますが、カスタマイズ可能となっています。Red Hat Single Sign-On には、独自のプロバイダーを実装することのできる数多くの SPI (サービスプロバイダーインターフェイス) があります。
6.1. SPI の実装 リンクのコピーリンクがクリップボードにコピーされました!
SPI を実装するには、その ProviderFactory および Provider インターフェイスを実装する必要があります。サービス設定ファイルも作成する必要があります。
たとえば、Theme Selector SPI を実装するには、ThemeSelectorProviderFactory および ThemeSelectorProvider を実装し、さらに META-INF/services/org.keycloak.theme.ThemeSelectorProviderFactory ファイルも指定する必要があります。
ThemeSelectorProviderFactory の例:
package org.acme.provider;
import ...
public class MyThemeSelectorProviderFactory implements ThemeSelectorProviderFactory {
@Override
public ThemeSelectorProvider create(KeycloakSession session) {
return new MyThemeSelectorProvider(session);
}
@Override
public void init(Config.Scope config) {
}
@Override
public void postInit(KeycloakSessionFactory factory) {
}
@Override
public void close() {
}
@Override
public String getId() {
return "myThemeSelector";
}
}
Red Hat Single Sign-On はプロバイダーファクトリーの単一のインスタンスを作成するので、複数の要求の状態を保存できます。プロバイダーのインスタンスは、各要求のファクトリーで create を呼び出すことで作成されるので、軽量オブジェクトでなければなりません。
ThemeSelectorProvider の例:
package org.acme.provider;
import ...
public class MyThemeSelectorProvider implements ThemeSelectorProvider {
public MyThemeSelectorProvider(KeycloakSession session) {
}
@Override
public String getThemeName(Theme.Type type) {
return "my-theme";
}
@Override
public void close() {
}
}
サービス設定ファイルの例 (META-INF/services/org.keycloak.theme.ThemeSelectorProviderFactory):
org.acme.provider.MyThemeSelectorProviderFactory
standalone.xml、standalone-ha.xml、または domain.xml を使用してプロバイダーを設定できます。
たとえば、以下を standalone.xml に追加します。
<spi name="themeSelector">
<provider name="myThemeSelector" enabled="true">
<properties>
<property name="theme" value="my-theme"/>
</properties>
</provider>
</spi>
その後、init メソッド ProviderFactory で設定を取得できます。
public void init(Config.Scope config) {
String themeName = config.get("theme");
}
必要に応じて、プロバイダーは他のプロバイダーを検索することもできます。以下に例を示します。
public class MyThemeSelectorProvider implements ThemeSelectorProvider {
private KeycloakSession session;
public MyThemeSelectorProvider(KeycloakSession session) {
this.session = session;
}
@Override
public String getThemeName(Theme.Type type) {
return session.getContext().getRealm().getLoginTheme();
}
}
6.1.1. 管理コンソールで SPI 実装からの情報を表示 リンクのコピーリンクがクリップボードにコピーされました!
プロバイダーに関する追加情報を Red Hat Single Sign-On 管理者に表示すると便利です。プロバイダーのビルド時間情報 (現在インストールされているカスタムプロバイダーのバージョンなど)、プロバイダーの現在の設定 (プロバイダーが通信するリモートシステムの URL)、または一部の運用情報 (プロバイダーが対話するリモートシステムからの応答時間) を表示できます。Red Hat Single Sign-On 管理コンソールは、サーバー情報のページを提供し、サーバー関連の情報を表示します。
プロバイダーからの情報を表示するには、ProviderFactory に org.keycloak.provider.ServerInfoAwareProviderFactory インターフェイスを実装するだけで十分です。
前の例の MyThemeSelectorProviderFactory の実装例:
package org.acme.provider;
import ...
public class MyThemeSelectorProviderFactory implements ThemeSelectorProviderFactory, ServerInfoAwareProviderFactory {
...
@Override
public Map<String, String> getOperationalInfo() {
Map<String, String> ret = new LinkedHashMap<>();
ret.put("theme-name", "my-theme");
return ret;
}
}