如何在Keycloft中添加自定义FTL页面



我想在现有的Key斗篷页面中添加一个自定义FTL页面。让我们称之为"特殊号码.ftl",它包含一个表单,您可以在其中输入一个号码并将其发送到后端。提交按钮应该触发我编写的自定义java代码。我该怎么做?我如何触发一个自定义的FTL页面显示,并通过点击提交按钮触发我写的一些代码?

您所能做的就是编写一个Key斗篷扩展并实现一个自定义RealmResourceProvider:

为此,从RealmResourceProviderFactory开始

public class CustomRealmResourceProviderFactory implements RealmResourceProviderFactory {
public static final String ID = "my-custom-pages";
@Override
public RealmResourceProvider create(KeycloakSession keycloakSession) {
return new CustomRealmResourceProvider();
}
@Override
public void init(Config.Scope scope) {
}
@Override
public void postInit(KeycloakSessionFactory keycloakSessionFactory) {
}
@Override
public void close() {
}
@Override
public String getId() {
return ID;
}
}

并且根据RealmResourceProvider:

public class CustomRealmResourceProvider implements RealmResourceProvider {

@Override
public Object getResource() {
return this;
}
@Override
public void close() {
}
@GET
@Path("mypage")
@Produces(MediaType.TEXT_HTML)
public Response getSuccessPage() {
LoginFormsProvider forms = keycloakSession.getProvider(LoginFormsProvider.class);
return forms.createForm("my-form-template.ftl");
}

}

创建自由标记模板theme-resources/templates/my-form-template.ftl

<#import "template.ftl" as layout>
<@layout.registrationLayout displayInfo=true; section>
<#if section = "header">
${msg("welcome")}
<#elseif section = "form">
CONTENT
</#if>
</@layout.registrationLayout>

然后将CustomRealmResourceProviderFactory的路径添加到项目中的以下文件中:META-INF/services/org.keycloak.services.resource.RealmResourceProviderFactory

构建并作为提供程序添加到您的密钥斗篷设置中。您的端点将位于:/realms/{realmName}/{RealmResourceProviderId}/{path}

在本例中:/realms/{realmName}/my-custom-pages/mypage

有关更多信息,请参阅:https://www.keycloak.org/docs/latest/server_development/#_extensions_rest

假设您已经在本地创建了一个页面,然后从cli运行以下命令:

docker cp special-number.ftl containerId:/opt/jboss/keycloak/themes/base/account

ContainerId将是您的docker容器id。在上面的例子中,它将转到基本主题,您可以将它更改为您希望它转到的任何位置。

最新更新