第 6 章 服务供应商接口(SPI)


红帽 Keycloak 的构建旨在在不需要自定义代码的情况下涵盖大多数用例,但我们希望它能够自定义。为了实现此红帽构建的 Keycloak 具有多个服务提供商接口(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";
    }
}

建议您的供应商工厂实施通过方法 getId () 返回唯一 id。但是,覆盖供应商 部分中所述,此规则可能存在一些例外情况。

注意

红帽 Keycloak 的构建创建了单一供应商工厂实例,从而可以为多个请求存储状态。通过在工厂中为各个请求调用 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

要配置您的供应商,请参阅配置供应商 章节。

例如,要配置供应商,您可以设置选项,如下所示:

bin/kc.[sh|bat] --spi-theme-selector-my-theme-selector-enabled=true --spi-theme-selector-my-theme-selector-theme=my-theme

然后,您可以在 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. 覆盖内置供应商

如上所述,建议您的 ProviderFactory 实现使用唯一的 ID。但是,同时覆盖红帽构建的 Keycloak 内置供应商可能很有用。推荐方法是带有唯一 ID 的 ProviderFactory 实现,然后为实例设置默认供应商,如 配置提供程序 章节中所述。另一方面,这可能并不总是可行。

例如,当您需要对默认的 OpenID Connect 协议进行一些自定义,并且您要覆盖 OIDCLoginProtocolFactory 的 Keycloak 实现的默认红帽构建,您需要保留相同的 providerId。例如,admin 控制台、OIDC 协议已知的端点和其他一些因素依赖协议工厂的 ID 为 openid-connect

在这种情况下,强烈建议实现自定义实现的方法 顺序(),并确保它的顺序高于内置实施。

public class CustomOIDCLoginProtocolFactory extends OIDCLoginProtocolFactory {

    // Some customizations here

    @Override
    public int order() {
        return 1;
    }
}

如果有多个具有相同供应商 ID 的实现,红帽构建的 Keycloak 运行时只能使用具有最高顺序的实现。

6.1.2. 显示管理控制台中您的 SPI 实施的信息

有时,向红帽构建的 Keycloak 管理员显示有关您的供应商的附加信息。您可以显示供应商构建时间信息(例如,当前安装的自定义供应商版本)、提供程序的当前配置(例如,您的供应商与远程系统通信的远程系统的 url)或一些操作信息(来自您供应商的响应的平均时间)。Red Hat build of Keycloak 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;
    }
}
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.