第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; } }