第 6 章 服务提供商接口(SPI)
Red Hat Single Sign-On 是在不需要自定义代码的情况下覆盖大多数用例,但我们也希望可以自定义。要达到此目的,Red Hat Single Sign-On 有许多可实施您自己的提供程序的服务提供商接口(SPI)。
6.1. 实施 SPI
要实施 SPI,您需要实施其提供商工厂和提供程序接口。您还需要创建服务配置文件。
例如,要实施 Theme Selector SPI,您需要实施 ThemeSelectorProviderFactory 和 ThemeSelectorProvidery,并提供文件 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>
然后您可以在 ProviderFactory
init 方法中检索配置:
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 Admin Console 提供 Server Info 页面来显示此类信息。
要显示供应商中的信息,足以在您的 ProviderFactory 中实现 org.keycloak.provider.ServerInfoAware
接口。
ProviderFactory
上例中的 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; } }