3.4. 创建主题
主题包括:
- HTML 模板(自由标记模板)
- 镜像
- 消息捆绑包
- 风格表
- 脚本
- 主题属性
除非计划替换每个单一页面,否则您应该扩展另一个主题。最有可能要扩展红帽构建的 Keycloak 主题,但如果您显著改变页面的外观和感觉,您也可以考虑扩展基础主题。该主题主要由 HTML 模板和消息捆绑包组成,而红帽构建的 Keycloak 主题主要包含镜像和风格表。
在扩展主题时,您可以覆盖单个资源(templates、样式表等)。如果您决定覆盖 HTML 模板,则可能需要在升级到新版本时更新自定义模板。
虽然创建一个主题,最好不要从 themes 目录中编辑主题资源,而无需重启红帽构建的 Keycloak。
流程
使用以下选项运行 Keycloak:
bin/kc.[sh|bat] start --spi-theme-static-max-age=-1 --spi-theme-cache-themes=false --spi-theme-cache-templates=false在
themes目录中创建一个目录。目录的名称成为主题的名称。例如,要创建一个名为
mytheme的主题,请创建目录themes/mytheme。在主题目录中,为您的主题提供的每种类型创建一个目录。
例如,要将登录类型添加到
mytheme主题,请创建themes/mytheme/login目录。对于每个类型,创建一个文件
theme.properties,允许为主题设置一些配置。例如,若要配置主题
themes/mytheme/login来扩展基础主题并导入一些常见资源,请使用以下内容创建文件themes/mytheme/login/theme.properties:parent=base import=common/keycloak现在,您已创建了一个支持登录类型的主题。
- 登录管理控制台以签出您的新主题
- 选择您的域
- 从菜单中选择 Realm Settings。
- 点 Themes 选项卡。
- 对于 Login Theme,请选择 mytheme 并点 Save。
打开域的登录页面。
您可以通过应用程序登录,或者打开帐户管理控制台(
/realms/{realm name}/account)来完成此操作。-
要查看更改父主题的影响,请在me
.properties中设置parent=keycloak并刷新登录页面。
务必在生产环境中重新启用缓存,因为它会对性能有严重影响。
如果要手动删除主题缓存的内容,您可以通过删除服务器发行版本的 data/tmp/kc-gzip-cache 目录来实现。如果您重新部署了自定义提供程序或自定义它们而不在之前的服务器执行中禁用它们缓存,则它很有用。
3.4.1. 主题属性 复制链接链接已复制到粘贴板!
me 属性在主题目录中的 < ;THEME TYPE>/theme.properties 文件中设置。
- Parent - 要扩展的父主题
- import - 从另一个主题导入资源
-
common - 覆盖通用资源路径。如果没有指定,默认值为
common/keycloak。这个值将用作${url.resourcesCommonPath}的后缀值,它通常用于 freemarker 模板(${url.resoucesCommonPath}的值为主题 root uri)。 - 风格 - 要包括的空间分开的样式列表,包括
- locales - 以逗号分隔的支持的区域列表
有可用于更改某些元素类型的 css 类的属性列表。有关这些属性的列表,请查看 keycloak 主题的相应类型的me.properties 文件(themes/keycloak/<THEME TYPE>/theme.properties)。
您还可以添加自己的自定义属性,并从自定义模板中使用它们。
当这样做时,您可以使用以下格式替换系统属性或环境变量:
-
${some.system.property}- for system properties -
${env.ENV_VAR}- 用于环境变量。
如果系统属性或环境变量没有使用 ${foo:defaultValue} 找到,也可以提供默认值。
如果没有提供默认值,且没有对应的系统属性或环境变量,则不会替换任何内容,并在模板中以格式结尾。
以下是可能的内容示例:
javaVersion=${java.version}
unixHome=${env.HOME:Unix home not found}
windowsHome=${env.HOMEPATH:Windows home not found}
3.4.2. 在主题中添加风格表 复制链接链接已复制到粘贴板!
您可以将一个或多个风格表添加到主题。
流程
-
在主题的 <
;THEME TYPE>/resources/css目录中创建一个文件。 将此文件添加到me
.properties 中的属性中。styles例如,要在
mytheme中添加styles.css,请使用以下内容创建themes/mytheme/login/resources/css/styles.css:.login-pf body { background: DimGrey none; }编辑
themes/mytheme/login/theme.properties并添加:styles=css/styles.css要查看更改,请打开域的登录页面。
您会注意到,唯一应用风格的样式是自定义风格表中的。
要包括父主题的样式,请从该主题加载样式。编辑
themes/mytheme/login/theme.properties并将风格改为:styles=web_modules/@fontawesome/fontawesome-free/css/icons/all.css web_modules/@patternfly/react-core/dist/styles/base.css web_modules/@patternfly/react-core/dist/styles/app.css node_modules/patternfly/dist/css/patternfly.min.css node_modules/patternfly/dist/css/patternfly-additions.min.css css/login.css css/styles.css注意要覆盖父风格表的样式,请确保最后列出您的样式表。
3.4.3. 在主题中添加脚本 复制链接链接已复制到粘贴板!
您可以在主题中添加一个或多个脚本。
流程
-
在主题的 <
;THEME TYPE>/resources/js目录中创建一个文件。 将文件添加到me
.properties 中的属性中。scripts例如,要将
script.js添加到mytheme,请使用以下内容创建themes/mytheme/login/resources/js/script.js:alert('Hello');然后编辑
themes/mytheme/login/theme.properties并添加:scripts=js/script.js
3.4.4. 将镜像添加到主题 复制链接链接已复制到粘贴板!
要使镜像可供主题使用,将它们添加到主题的 < ;THEME TYPE>/resources/img 目录中。它们可用于样式表,也可以在 HTML 模板中直接使用。
例如,要将镜像添加到 mytheme 中,将镜像复制到 themes/mytheme/login/resources/img/image.jpg 中。
然后您可以在自定义风格的表格中使用此镜像:
body {
background-image: url('../img/image.jpg');
background-size: cover;
}
或者直接在 HTML 模板中使用,将以下内容添加到自定义 HTML 模板中:
<img src="${url.resourcesPath}/img/image.jpg">
3.4.5. messages 复制链接链接已复制到粘贴板!
模板中的文本是从消息捆绑包加载的。扩展另一个主题的主题将继承父消息捆绑包中的所有消息,您可以通过将 < THEME TYPE>/messages/messages_en.properties 添加到您的主题来覆盖单个消息。
例如,要将登录表单上的 Username 替换为 mytheme 的 your Username,将文件 themes/mytheme/login/messages/messages_en.properties 替换为以下内容:
usernameOrEmail=Your Username
在使用消息时,在消息值中,{0} 和 IANA 等消息值将被替换为参数。例如,登录到 {0} 中的 {0} 被替换为域的名称。
这些消息捆绑包的文本可以被特定于域的值覆盖。特定于域的值可以通过 UI 和 API 进行管理。
3.4.6. 在域中添加语言 复制链接链接已复制到粘贴板!
先决条件
- 要为域启用国际化,请参阅 服务器管理指南。
流程
-
在主题的目录中创建文件
<THEME TYPE>/messages/messages_<LOCALE>.properties。 将此文件添加到 <
THEME TYPE>/theme.properties中的区域设置属性中。对于可供域登录、帐户和电子邮件使用的语言,主题必须支持语言,因此您需要为这些主题类型添加您的语言。例如,要将 Norwegian 翻译添加到
mytheme主题中,创建包含以下内容的文件 themes/mytheme/login/messages_no.properties:usernameOrEmail=Brukernavn password=Passord如果您省略了消息的翻译,将使用英语。
编辑
themes/mytheme/login/theme.properties并添加:locales=en,no-
为
account和email主题类型添加相同的内容。为此,请创建themes/mytheme/account/messages/messages_no.properties和themes/mytheme/email/messages/messages_no.properties。将这些文件留空将导致使用英语消息。 -
将
themes/mytheme/login/theme.properties复制到themes/mytheme/account/theme.properties和themes/mytheme/email/theme.properties。 为语言选择器添加翻译。这可以通过向英语添加消息来完成。要做到这一点,将以下内容添加到
themes/mytheme/account/messages_en.properties中,以及themes/mytheme/login/messages_en.properties:locale_no=Norsk默认情况下,消息属性文件应该使用 ISO-8859-1 进行编码。也可以使用特殊标头指定编码。例如,使用 UTF-8 编码:
# encoding: UTF-8 usernameOrEmail=....
3.4.7. 添加自定义身份提供程序图标 复制链接链接已复制到粘贴板!
红帽构建的 Keycloak 支持为自定义身份提供程序添加图标,这些图标显示在登录屏幕中。
流程
-
在您的登录
主题.properties文件中定义图标类(例如:themes/mytheme/login/theme.properties),带有键模式kcLogoIdP-<alias>。 对于别名为
myProvider的身份提供程序,您可以在自定义主题的me.properties文件中添加一行。例如:kcLogoIdP-myProvider = fa fa-lock
所有图标都位于 PatternFly4 的官方网站上。社交供应商的图标已在基础登录主题属性(themes/keycloak/login/theme.properties)中定义,您可以在其中提升自己。
3.4.8. 创建自定义 HTML 模板 复制链接链接已复制到粘贴板!
红帽构建的 Keycloak 使用 Apache Freemarker 模板来生成 HTML。您可以通过创建 < THEME TYPE>/<TEMPLATE>.ftl 来覆盖您自己的主题中的单个模板。有关使用的模板列表请查看 themes/base/<THEME TYPE>。
流程
- 将模板从基础主题复制到您自己的主题。
应用您需要的修改。
例如,要为
mytheme主题创建自定义登录表单,请将themes/base/login/login.ftl复制到themes/mytheme/login并在编辑器中打开它。在第一行(<114import …>)后,添加
<h1>HELLO WORLD!</h1>,如下所示:<#import "template.ftl" as layout> <h1>HELLO WORLD!</h1> ...- 备份修改后的模板。当升级到新版本的 Keycloak 时,您可能需要更新您的自定义模板,以便在适用时对原始模板应用更改。
3.4.9. 电子邮件 复制链接链接已复制到粘贴板!
要编辑电子邮件的主题和内容,如密码恢复电子邮件,请在主题 的电子邮件 类型中添加消息捆绑包。每个电子邮件都有三个消息:一个主题,一个用于纯文本正文,一个用于 html 正文。
要查看所有可用的电子邮件,请查看 themes/base/email/messages/messages_en.properties。
例如,要更改 mytheme 主题的密码恢复电子邮件,创建 themes/mytheme/email/messages/messages_en.properties,其内容如下:
passwordResetSubject=My password recovery
passwordResetBody=Reset password link: {0}
passwordResetBodyHtml=<a href="{0}">Reset password</a>