繁体   English   中英

Keycloak 主题选择器提供程序 - 创建未调用

[英]Keycloak Theme Selector Provider - Create not called

我想在 Keycloak 中扩展主题选择器提供程序的功能。 为此,我扩展了ThemeSelectorProviderThemeSelectorProviderFactoryThemeSelectorSpi

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.ThemeSelectorProviderFactoryorg.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";
}

此外,我没有实现接口,而是扩展了DefaultThemeSelectorProviderDefaultThemeSelectorProviderFactory ,因为我想使用现有的功能。 从理论上讲,这不应该是必需的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM