6장. SPI(Service Provider Interfaces)
Red Hat Single Sign-On은 사용자 정의 코드 없이도 대부분의 사용 사례를 처리하도록 설계되었지만 사용자 정의할 수 있기를 바랍니다. 이를 위해 Red Hat Single Sign-On에는 자체 공급자를 구현할 수 있는 다양한 SPI(서비스 공급자 인터페이스)가 있습니다.
6.1. SPI 구현
SPI를 구현하려면 ProviderFactory 및 Provider 인터페이스를 구현해야 합니다. 서비스 구성 파일도 생성해야 합니다.
예를 들어 Theme Selector SPI를 구현하려면 ThemeSelectorProviderFactory 및 ThemeSelectorProviderProvider 파일을 구현해야 하며 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 관리 콘솔은 이러한 종류의 정보를 표시할 수 있는 서버 정보 페이지를 제공합니다.
공급자의 정보를 표시하려면 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; } }