Keycloak 入门实战(5)--自定义登录页面

Keycloak 默认的登录页面显然不适合实际的使用,本文主要介绍如何自定义登录页面;文中使用到的软件版本:JDK 1.8.0_191、Keycloak 16.1.1。

1、Keycloak 准备

这里假设 Keycloak 已经安装完毕;Keycloak 的安装方法可参考:Keycloak 入门实战(2)--安装

2、主题简介

2.1、主题类型

Keycloak 有多种不同类型的主题:

  • Account - Account management

  • Admin - Admin console

  • Email - Emails

  • Login - Login forms

主题设置的位置如下:

2.2、默认主题

Keycloak 与主题根目录中的默认主题捆绑在一起;为了简化升级,不应直接编辑默认主题;应创建新的主题来扩展已有的主题。

2.3、主题组成部分

一个主题包含如下模块:

除非打算替换每个页面,否则应该扩展另一个主题。一般情况下你可能会控制 Keycloak 主题,但是如果要显著更改页面的外观和感觉,也可以考虑扩展 base 主题。base 主题主要由 HTML 模板和消息组成,而 Keycloak 主题主要包含图片和样式表。

要创建新主题,首先在主题目录中创建一个新目录。目录的名称将成为主题的名称。例如,要创建一个名为 mytheme 的主题,创建目录 themes/mytheme 即可。在主题目录中创建对应主题类型的目录,如:对应登录主题类型,创建 themes/mytheme/login 目录。

 对于每种类型的主题都已一个对应的配置文件:<THEME TYPE>/theme.properties,它有如下属性:

  • parent - Parent theme to extend

  • import - Import resources from another theme

  • styles - Space-separated list of styles to include

  • locales - Comma-separated list of supported locales

你也看自定义属性,然后在模板中使用它们。执行此操作时,可以使用以下格式替换系统属性或环境变量:

  • ${some.system.property} - for system properties

  • ${env.ENV_VAR} - for environment variables.

如:javaVersion=${java.version}

2.4、样式

一个主题可以有一个或多个样式表。要添加样式表,可在 <THEME TYPE>/resources/css 目录中创建样式文件,然后将其添加到 theme.properties 中的 styles 属性中。

如:创建 themes/mytheme/login/resources/css/styles.css 文件:

.login-pf body {
    background: DimGrey none;
}

在 themes/mytheme/login/theme.properties 中增加:

styles=css/styles.css

如果需要包含父主题的样式,应这样配置:

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

2.5、JS 脚本

一个主题可以有一个或多个 JS 文件。要添加 JS 文件,可在 <THEME TYPE>/resources/js 目录中创建 JS 文件,然后将其添加到 theme.properties 中的 scripts 属性中。

如:创建 themes/mytheme/login/resources/js/script.js 文件:

alert('Hello');

在 themes/mytheme/login/theme.properties 中增加:

scripts=js/script.js

2.6、图片

要使图像可用于主题,将其添加到 <THEME TYPE>/resources/img 目录中;这样就可以在样式表中使用,也可以直接在 HTML 模板中使用。

如:拷贝图片文件到 themes/mytheme/login/resources/img/image.jpg,在样式表中使用:

body {
    background-image: url('../img/image.jpg');
    background-size: cover;
}

在 HTML 模板中使用:

<img src="${url.resourcesPath}/img/image.jpg">

2.7、消息

模板中的文本是从消息包加载的。扩展另一个主题将继承父级消息包中的所有消息,可以添加 <THEME TYPE>/messages/messages_en.properties 来覆盖单个消息。

如:要将登录表单上的 “Username or email” 替换为 “Your Username”,创建 themes/mytheme/login/messages/messages_en.properties 文件:

usernameOrEmail=Your Username

2.8、国际化

Keycloak  支持国际化,可以在控制台开启该功能。要添加新语言环境,可创建 <THEME TYPE>/messages/messages_<LOCALE>.properties 文件,然后在其中定义需覆盖的属性。

如:创建中文的消息文件 themes/mytheme/login/messages/messages_zh_CN.properties,覆盖登录标题:

# encoding: utf-8
loginAccountTitle=登录您的帐户

注:默认的编码为 ISO-8859-1,如果文件为其他编码,需使用 encoding 头指定。

3、自定义主题

这里只演示自定义登录主题,主题名称为 mytheme,该主题继承 keycloak 主题。

3.1、创建主题目录

创建 themes/mytheme/login 目录。

3.2、上传图片

上传图片文件:
themes/mytheme/login/resources/img/login-bg.png
themes/mytheme/login/resources/img/logo-text.png

3.3、编写样式文件

themes/mytheme/login/resources/css/mylogin.css:

.login-pf body {
    background: url("../img/login-bg.png") no-repeat center center fixed;
    background-size: cover;
    height: 100%;
}

div.kc-logo-text {
    background-image: url(../img/logo-text.png);
    background-repeat: no-repeat;
    height: 63px;
    width: 300px;
    margin: 0 auto;
}

3.4、编写消息文件

themes/mytheme/login/messages/messages_zh_CN.properties:

# encoding: utf-8
loginAccountTitle=登录您的帐户

3.5、编写主题配置文件

themes/mytheme/login/theme.properties:

parent=keycloak
import=common/keycloak

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.qmin.css css/login.css css/mylogin.css

3.6、主题效果

重启 Keycloak 后,把登录主题设置为 mytheme:

 

 重新登录的页面样式如下:

3.7、涉及新增的文件

 

posted @ 2022-04-23 18:29  且行且码  阅读(2806)  评论(0编辑  收藏  举报