我们已经创建了一个Keycloak扩展名(主要是一个附加的 Authenticator ),并试图将其打包为一个 jar 存档,以便我们可以在无需复制模板的情况下进行部署并编辑.properties
文件。
身份验证器使用一种自定义表单,该表单已按照Theme Resources中的说明放入了theme-resources/templates
目录中,并且效果很好。但是,我们无法将邮件放入接收它们的位置。将显示消息密钥,而不是消息。如果我们将邮件直接放入keycloak-6.0.1/themes/base/login
(而不是我们的档案库)中,它将起作用。
它影响两个地方:
以自定义格式本地化的邮件(下面的Freemarker模板中的company.auth.title
)
<#import "template.ftl" as layout>
<@layout.registrationLayout; section>
<#if section = "header">
${msg("company.auth.title")}
<#elseif section = "form">
...
身份验证器中的错误消息(company.auth.invalid-code
)
Response challenge = context.form()
.setError("company.auth.invalid-code")
.createForm("company-auth-challenge.ftl");
context.failureChallenge(AuthenticationFlowError.INVALID_CREDENTIALS, challenge);
文档似乎表明本地化的邮件文件需要转到theme-resources/resources
,但无法正常工作。
那么我们应该将消息文件(例如messages_en.properties
)放在jar存档中的什么位置,以便它们被Keycloak拾取?
答案 0 :(得分:1)
这是KeyCloak的局限性(从6.0.1开始)。本地化消息仅来自主题。您必须创建自己的主题并将其与JAR捆绑在一起。而且由于KeyCloak不会合并主题,所以您无法在JAR中重新定义默认的 keycloak 主题,因此必须将领域的登录主题更改为自定义主题。
您的模板可以保留在 theme-resources 中,但是可以规范地将其放置在与 theme.properties 平行的主题文件夹中。如果您的主题叫 brokenspoon ,那么您的MVP JAR应该包含:
keycloak-themes.json 的内容-定义一个登录主题:
{
"themes": [{
"name" : "brokenspoon",
"types": [ "login" ]
}]
}
theme.properties 的内容- 您的自定义主题可以扩展默认的 keycloak 主题:
parent=keycloak
部署JAR,重新启动 Keycloak 服务器,然后在 Realm Settings → Themes 下更改该领域的默认主题。在更改主题设置之前但在部署JAR之后重新启动服务器很重要,因为否则将不会加载JAR中的主题。这似乎是由于特定于主题的内部缓存机制所致。