自定义主题
Keycloak 主题控制登录页面、账户控制台、管理控制台和电子邮件模板的外观与风格。本指南介绍如何在由 Kubernetes Operator 管理的部署中自定义主题。
目录
主题类型选择主题创建自定义主题主题目录结构theme.properties自定义 CSS 示例覆盖文本标签在 Kubernetes 中部署主题选项 A:自定义 Keycloak 镜像(生产环境推荐)选项 B:ConfigMap(仅限开发和测试)自定义电子邮件模板覆盖电子邮件模板自定义电子邮件消息国际化(i18n)主题类型
选择主题
要在内置主题之间切换:
- 在管理控制台中,转到 Realm Settings > Themes 选项卡。
- 为每种类型(Login、Account、Admin、Email)选择所需的主题。
- 单击 Save。
内置主题包括 keycloak(默认)和 keycloak.v2(用于新的账户控制台)。
创建自定义主题
自定义主题是一个目录(或 JAR 归档),其中包含用于覆盖或扩展基础主题的文件。
主题目录结构
theme.properties
自定义 CSS 示例
创建 resources/css/custom.css:
覆盖文本标签
创建 messages/messages_en.properties:
在 Kubernetes 中部署主题
在由 Kubernetes Operator 管理的部署中,必须让自定义主题可供 Keycloak Pod 使用。建议构建自定义容器镜像。基于 ConfigMap 的替代方案仅适用于开发和测试。
选项 A:自定义 Keycloak 镜像(生产环境推荐)
构建预安装主题的自定义容器镜像:
下面的示例使用上游 Community 镜像,因此可以按原样运行。基于 Community 镜像构建的镜像是 Community Keycloak™ 构建版本:它不包含 Alauda Application Services Identity Management E1 的基础镜像、打包内容或补丁,也不受本网站支持政策的覆盖。对于受支持的自定义镜像,应基于产品自有的服务器镜像构建——即已安装的 Operator 为其实例使用的镜像引用——并使其版本与当前运行的版本保持一致。
构建并推送镜像:
更新 Keycloak CR 以使用自定义镜像:
使用自定义镜像时,必须在 Dockerfile 中的 kc.sh build 命令中包含所有必需的构建时选项(例如 --health-enabled=true 和 --metrics-enabled=true)。在使用预构建的自定义镜像时,通过 Keycloak CR 中的 additionalOptions 指定的构建时选项会被忽略,因为 Operator 不会重新运行构建步骤。
每当 Keycloak 升级到新版本时,还必须重新构建并重新部署该镜像。确保 CI/CD 管道包含此步骤。
选项 B:ConfigMap(仅限开发和测试)
在开发期间进行快速迭代时,可以通过 ConfigMap 和 unsupported.podTemplate 字段挂载主题:
-
将主题目录打包到 ConfigMap 中:
-
通过
KeycloakCR 将 ConfigMap 挂载到 Keycloak Pod 中: -
应用更新后的 CR,并等待 Pod 重启。
-
在管理控制台中,转到 Realm Settings > Themes,然后选择
my-custom-theme。
此方法使用 unsupported.podTemplate 字段,该字段不属于稳定的 Keycloak Operator API。未来版本中可能会在不另行通知的情况下发生更改或被移除。此外:
- ConfigMap 的大小限制为 1 MiB,可能无法容纳包含图像的主题。
unsupported字段不在标准支持和升级兼容性保证的覆盖范围内。- 滚动更新可能会暂时导致 Pod 使用不匹配的主题版本。
对于生产部署,始终使用自定义镜像方法(选项 A)。
自定义电子邮件模板
电子邮件模板使用 FreeMarker(.ftl)语法,并属于 email 主题类型。
覆盖电子邮件模板
- 在自定义主题中,创建
email/html/和email/text/目录。 - 从默认主题复制要自定义的模板。
- 修改模板内容。
常用电子邮件模板:
自定义电子邮件消息
在 messages/messages_en.properties 中覆盖电子邮件主题和正文文本:
国际化(i18n)
Keycloak 主题通过消息属性文件支持多种语言。
- 在 Realm Settings > Localization 选项卡中启用国际化。
- 添加支持的区域设置。
- 在自定义主题中,为每个区域设置创建消息文件:
messages/messages_en.propertiesmessages/messages_zh_CN.propertiesmessages/messages_ja.properties
- 在 Realm 设置中设置默认区域设置。