将消息放在Keycloak扩展档案中的位置

时间:2019-04-30 07:24:12

标签: java freemarker keycloak properties-file

我们已经创建了一个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拾取?

1 个答案:

答案 0 :(得分:1)

这是KeyCloak的局限性(从6.0.1开始)。本地化消息仅来自主题。您必须创建自己的主题并将其与JAR捆绑在一起。而且由于KeyCloak不会合并主题,所以您无法在JAR中重新定义默认的 keycloak 主题,因此必须将领域的登录主题更改为自定义主题。

您的模板可以保留在 theme-resources 中,但是可以规范地将其放置在与 theme.properties 平行的主题文件夹中。如果您的主题叫 brokenspoon ,那么您的MVP JAR应该包含:

  • META-INF / keycloak-themes.json
  • 主题/断勺/登录/消息/messages_en.properties
  • 主题/断勺/登录/theme.properties
  • theme-resources / templates / my-custom-login.ftl

keycloak-themes.json 的内容-定义一个登录主题:

{
  "themes": [{
    "name" : "brokenspoon",
    "types": [ "login" ]
  }]
}

theme.properties 的内容- 您的自定义主题可以扩展默认的 keycloak 主题:

parent=keycloak

部署JAR,重新启动 Keycloak 服务器,然后在 Realm Settings Themes 下更改该领域的默认主题。在更改主题设置之前但在部署JAR之后重新启动服务器很重要,因为否则将不会加载JAR中的主题。这似乎是由于特定于主题的内部缓存机制所致。