我们使用带有 keycloak 18 版本的自定义登录提供程序,一切正常。
但是当我们升级到 keycloak 版本 19 时,自定义登录提供程序不会被调用。
在下面的示例中,我们可以看到应该调用 CustomProviderFactory create 方法,它适用于 keycloak 18 版本,但不适用于 keycloak 19 版本。所有 jboss 部署.xml 都已就位。
例如
public class CustomProviderFactory extends FreeMarkerLoginFormsProviderFactory {
private FreeMarkerUtil freeMarker;
@Override
public LoginFormsProvider create(KeycloakSession session) {
return new CustomLoginFormsProvider(session, freeMarker);
}
@Override
public void init(Config.Scope config) {
freeMarker = new FreeMarkerUtil();
}
@Override
public void close() {
freeMarker = null;
}
@Override
public String getId() {
return "freemarker";
}
}
public class CustomLoginFormsProvider extends FreeMarkerLoginFormsProvider {
public LoginFormsProvider(KeycloakSession session, FreeMarkerUtil freeMarker) {
super(session, freeMarker);
}
@Override
protected void createCommonAttributes(Theme theme, Locale locale, Properties messagesBundle, UriBuilder baseUriBuilder, LoginFormsPages page) {
super.createCommonAttributes(theme, locale, messagesBundle, baseUriBuilder, page);
}
}
我使用的是Keycloak 22.0.5
我需要设置这些属性 - 我在 Keycloak 启动命令行上执行此操作:
...
--spi-login-provider=
--spi-login-
...
我的工厂类扩展 FreeMarkerLoginFormsProviderFactory 的地方
我没有对 getId() 返回的字符串使用 freemarker;我用的是我自己的ID。
我将 ID 设置为类似于扩展 FreeMarkerLoginFormsProvider 的类的类名称
例如,如果我的自定义类被命名为:
公共类 MyGoodClass 扩展 FreeMarkerLoginFormsProvider { ... }
公共类 MyGoodClassFactory 扩展 FreeMarkerLoginFormsProviderFactory { ... }
我在 MyGoodClassFactory 中使 getId() 方法返回 my-good-class:
@Override
public String getId() {
return "my-good-class";
}
那么属性设置将是:
...
--spi-login-provider=我的好班级
--spi-login-my-good-class-enabled=true
...
希望这有帮助。