[英]Keycloak Theme Selector Provider - Create not called
我想在 Keycloak 中擴展主題選擇器提供程序的功能。 為此,我擴展了ThemeSelectorProvider
、 ThemeSelectorProviderFactory
和ThemeSelectorSpi
。
CustomThemeSelectorProvider
import org.keycloak.models.KeycloakSession;
import org.keycloak.theme.Theme;
import org.keycloak.theme.ThemeSelectorProvider;
public class CustomThemeSelectorProvider implements ThemeSelectorProvider {
public final static String ID = "theme-selector";
private final KeycloakSession session;
public CustomThemeSelectorProvider(KeycloakSession session) {
this.session = session;
}
@Override
public String getThemeName(Theme.Type type) {
return "base";
}
@Override
public void close() {}
}
CustomThemeSelectorProviderFactory
import org.keycloak.Config;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
import org.keycloak.theme.ThemeSelectorProvider;
import org.keycloak.theme.ThemeSelectorProviderFactory;
public class CustomThemeSelectorProviderFactory implements ThemeSelectorProviderFactory {
@Override
public ThemeSelectorProvider create(KeycloakSession session) {
System.out.println("This isn't called");
return new CustomThemeSelectorProvider(session);
}
@Override
public void init(Config.Scope config) {
System.out.println("This is called");
}
@Override
public void postInit(KeycloakSessionFactory factory) {
}
@Override
public void close() {
}
@Override
public String getId() {
return CustomThemeSelectorProvider.ID;
}
}
CustomThemeSelectorSpi
import org.keycloak.provider.Provider;
import org.keycloak.provider.ProviderFactory;
import org.keycloak.theme.ThemeSelectorSpi;
public class CustomThemeSelectorSpi extends ThemeSelectorSpi {
@Override
public boolean isInternal() {
return false;
}
@Override
public String getName() {
return "customThemeSelector";
}
@Override
public Class<? extends Provider> getProviderClass() {
System.out.println("Not called");
return CustomThemeSelectorProvider.class;
}
@Override
public Class<? extends ProviderFactory> getProviderFactoryClass() {
System.out.println("Not called");
return CustomThemeSelectorProviderFactory.class;
}
}
jboss-部署-結構.xml
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="org.keycloak.keycloak-server-spi" />
<module name="org.keycloak.keycloak-server-spi-private" />
<module name="org.keycloak.keycloak-services" />
</dependencies>
</deployment>
</jboss-deployment-structure>
我還在資源的META-INF/services
目錄中創建了org.keycloak.theme.ThemeSelectorProviderFactory
和org.keycloak.theme.ThemeSelectorSpi
文件。
當我運行Keycloak
時,它運行提供程序的init
方法而不是create
方法,並且似乎沒有其他任何事情發生。 我的其他EventListenerSpi
工作正常,但我無法讓ThemeSelectorSpi
工作。
我做錯了什么?
你不需要在standalone.xml
中配置提供者嗎
(見https://keycloak.discourse.group/t/how-to-change-theme-selector-provider/7894 )
或通過 cli
bin/kc.[sh|bat] --spi-theme-selector-my-theme-selector-enabled=true --spi-theme-selector-my-theme-selector-theme=my-theme
( https://www.keycloak.org/docs/latest/server_development/#implementing-an-spi )
我想到了。 我需要使用與默認提供程序工廠 ( DefaultThemeSelectorProvider
) 相同的 ID。
CustomThemeSelectorProviderFactory
@Override public String getId() {
return "default";
}
此外,我沒有實現接口,而是擴展了DefaultThemeSelectorProvider
和DefaultThemeSelectorProviderFactory
,因為我想使用現有的功能。 從理論上講,這不應該是必需的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.