我正在使用 Keycloak 25,我正在尝试通过 keycloak SPI 修改/扩展/替换 FreeMarkerLoginFormsProvider。我尝试过使用针对几个不同问题提供的方法。 就像这里的这个:keycloak 自定义登录提供程序未在版本 19 中调用,但未成功。我仍然收到错误:
ERROR [org.keycloak.services.error.KeycloakErrorHandler] (executor-thread-14) Uncaught server error: java.lang.NullPointerException: Cannot invoke "org.keycloak.forms.login.LoginFormsProvider.setAuthenticationSession(org.keycloak.sessions.AuthenticationSessionModel)" because the return value of "org.keycloak.models.KeycloakSession.getProvider(java.lang.Class)" is null.
这是我的代码:
public class CustomLoginFormsProvider extends FreeMarkerLoginFormsProvider {
private static final Logger logger = Logger.getLogger(CustomLoginFormsProvider.class);
public CustomLoginFormsProvider(KeycloakSession session) {
super(session);
logger.info("Injecting custom login forms provider!");
}
}
和
public class CustomLoginFormsProviderFactory extends FreeMarkerLoginFormsProviderFactory {
public static final String PROVIDER_ID = "custom-login-provider";
@Override
public LoginFormsProvider create(KeycloakSession session) {
return new CustomLoginFormsProvider(session);
}
@Override
public String getId() {
return PROVIDER_ID;
}
}
我已经在 META-INF org.keycloak.forms.login.LoginFormsProviderFactory 中创建了一个文件,其中包含我的自定义类。
我还用 --spi-login-provider=custom-login-provider
--spi-login-custom-login-provider-enabled=true
启动服务器 我还尝试复制整个类并分别实现LoginFormsProvider 和 LoginFormsProviderFactory 类。
keycloak 不再支持此功能吗? 如何解决NULL指针问题?
编辑:在头撞了一段时间后,我交叉发布了这个问题目前它也不包含解决方案,但将来可能会包含解决方案。您可以在我的回答中找到问题的解决方法。
Keycloak 的逻辑决定了必须按以下顺序加载的提供程序的顺序:
@Override
public int order() {
return 1;
}
必须以最高优先级显式指定订购方法。