[英]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.