自定义主题

Keycloak 主题控制登录页面、账户控制台、管理控制台和电子邮件模板的外观与风格。本指南介绍如何在由 Kubernetes Operator 管理的部署中自定义主题。

主题类型

主题类型控制内容
登录登录、注册、密码重置和 OTP 页面
账户用户自助账户管理控制台
管理管理控制台 UI
电子邮件电子邮件模板(验证、密码重置、事件通知)
欢迎根 URL 显示的欢迎页面

选择主题

要在内置主题之间切换:

  1. 在管理控制台中,转到 Realm Settings > Themes 选项卡。
  2. 为每种类型(Login、Account、Admin、Email)选择所需的主题。
  3. 单击 Save。

内置主题包括 keycloak(默认)和 keycloak.v2(用于新的账户控制台)。

创建自定义主题

自定义主题是一个目录(或 JAR 归档),其中包含用于覆盖或扩展基础主题的文件。

主题目录结构

my-custom-theme/
└── login/                      # Theme type (login, account, admin, email)
    ├── theme.properties        # Theme configuration
    ├── resources/
    │   ├── css/
    │   │   └── custom.css      # Custom stylesheets
    │   └── img/
    │       └── logo.png        # Custom logo
    ├── messages/
    │   ├── messages_en.properties  # English text overrides
    │   └── messages_zh.properties  # Chinese text overrides
    └── login.ftl               # Custom FreeMarker login page template (optional)

theme.properties

# Inherit from the default Keycloak theme
parent=keycloak
import=common/keycloak

# Add custom stylesheet
styles=css/custom.css

# Set custom logo (overrides the Keycloak logo)
# kcLogoLink=https://my-company.example.com

自定义 CSS 示例

创建 resources/css/custom.css:

/* Override the login page background */
.login-pf body {
    background-color: #1a1a2e;
}

/* Override the login card */
#kc-login {
    background: #ffffff;
    border-radius: 8px;
}

/* Custom logo size */
#kc-logo-wrapper img {
    max-height: 60px;
}

覆盖文本标签

创建 messages/messages_en.properties:

loginAccountTitle=Sign in to My Company
loginTitle=Welcome
loginTitleHtml=Welcome to <strong>My Company</strong>

在 Kubernetes 中部署主题

在由 Kubernetes Operator 管理的部署中,必须让自定义主题可供 Keycloak Pod 使用。建议构建自定义容器镜像。基于 ConfigMap 的替代方案仅适用于开发和测试。

选项 A:自定义 Keycloak 镜像(生产环境推荐)

构建预安装主题的自定义容器镜像:

基于产品镜像构建自定义镜像

下面的示例使用上游 Community 镜像,因此可以按原样运行。基于 Community 镜像构建的镜像是 Community Keycloak™ 构建版本:它不包含 Alauda Application Services Identity Management E1 的基础镜像、打包内容或补丁,也不受本网站支持政策的覆盖。对于受支持的自定义镜像,应基于产品自有的服务器镜像构建——即已安装的 Operator 为其实例使用的镜像引用——并使其版本与当前运行的版本保持一致。

FROM quay.io/keycloak/keycloak:26.7.4

# Copy custom theme
COPY my-custom-theme /opt/keycloak/themes/my-custom-theme

# Rebuild Keycloak with the theme — include any build-time options here
RUN /opt/keycloak/bin/kc.sh build \
  --health-enabled=true \
  --metrics-enabled=true

构建并推送镜像:

docker build -t my-registry.example.com/keycloak-custom:26.7.4 .
docker push my-registry.example.com/keycloak-custom:26.7.4

更新 Keycloak CR 以使用自定义镜像:

spec:
  image: my-registry.example.com/keycloak-custom:26.7.4
自定义镜像中的构建时选项

使用自定义镜像时,必须在 Dockerfile 中的 kc.sh build 命令中包含所有必需的构建时选项(例如 --health-enabled=true 和 --metrics-enabled=true)。在使用预构建的自定义镜像时,通过 Keycloak CR 中的 additionalOptions 指定的构建时选项会被忽略,因为 Operator 不会重新运行构建步骤。

每当 Keycloak 升级到新版本时,还必须重新构建并重新部署该镜像。确保 CI/CD 管道包含此步骤。

选项 B:ConfigMap(仅限开发和测试)

在开发期间进行快速迭代时,可以通过 ConfigMap 和 unsupported.podTemplate 字段挂载主题:

  1. 将主题目录打包到 ConfigMap 中:

    kubectl create configmap keycloak-custom-theme \
      --from-file=my-custom-theme/ \
      -n <namespace>
  2. 通过 Keycloak CR 将 ConfigMap 挂载到 Keycloak Pod 中:

    spec:
      unsupported:
        podTemplate:
          spec:
            containers:
              - volumeMounts:
                  - name: custom-theme
                    mountPath: /opt/keycloak/themes/my-custom-theme
            volumes:
              - name: custom-theme
                configMap:
                  name: keycloak-custom-theme
  3. 应用更新后的 CR,并等待 Pod 重启。

  4. 在管理控制台中,转到 Realm Settings > Themes,然后选择 my-custom-theme。

不推荐用于生产环境

此方法使用 unsupported.podTemplate 字段,该字段不属于稳定的 Keycloak Operator API。未来版本中可能会在不另行通知的情况下发生更改或被移除。此外:

  • ConfigMap 的大小限制为 1 MiB,可能无法容纳包含图像的主题。
  • unsupported 字段不在标准支持和升级兼容性保证的覆盖范围内。
  • 滚动更新可能会暂时导致 Pod 使用不匹配的主题版本。

对于生产部署,始终使用自定义镜像方法(选项 A)。

自定义电子邮件模板

电子邮件模板使用 FreeMarker(.ftl)语法,并属于 email 主题类型。

覆盖电子邮件模板

  1. 在自定义主题中,创建 email/html/ 和 email/text/ 目录。
  2. 从默认主题复制要自定义的模板。
  3. 修改模板内容。

常用电子邮件模板:

模板触发条件
email-verification.ftl需要执行电子邮件验证操作
password-reset.ftl请求重置密码
event-login_error.ftl登录失败通知
executeActions.ftl需要执行操作的电子邮件

自定义电子邮件消息

在 messages/messages_en.properties 中覆盖电子邮件主题和正文文本:

emailVerificationSubject=Verify your My Company account
passwordResetSubject=My Company - Password Reset

国际化(i18n)

Keycloak 主题通过消息属性文件支持多种语言。

  1. 在 Realm Settings > Localization 选项卡中启用国际化。
  2. 添加支持的区域设置。
  3. 在自定义主题中,为每个区域设置创建消息文件:
    • messages/messages_en.properties
    • messages/messages_zh_CN.properties
    • messages/messages_ja.properties
  4. 在 Realm 设置中设置默认区域设置。