尝试在Spring Boot应用中使用Keycloak和OpenID Connect
简介
Keycloak的Advent Calendar第三天,将解释将基于Spring Boot的Web应用程序的认证委托给Keycloak的步骤。Keycloak提供了适用于Spring Boot的适配器,可以轻松地将基于Spring Boot的Web应用程序进行安全保护。这将使其成为支持最新认证协议”OpenID Connect”(以下简称OIDC)的安全的Spring Boot应用程序。
当能够进行协同操作时,用户作为OIDC的“终端用户”与基于Spring Boot的Web应用程序作为OIDC的“依赖方”一起,将Keycloak作为OIDC的“OpenID提供者”。
在开始之前
在开始本教程前,您需要完成Keycloak的设置并创建管理员用户。请参考Keycloak Advent Calendar第2天的文章进行这些操作。另外,由于我们将使用Gradle或Maven来构建和启动Web应用程序,请提前安装其中之一。
此外,本次我们将在本地环境构建Keycloak和基于Spring Boot的Web应用程序。
合作流程
合作的步骤如下。完成后,进行操作确认。
-
- Keycloak设置
1.1 创建领域
1.2 创建客户端
1.3 创建角色
1.4 创建用户并分配角色
创建简单的Spring Boot应用程序
2.1 使用Spring Initializr创建应用程序的模板
2.2 创建类和HTML文件
2.3 配置应用程序与Keycloak的集成
1.1. 创建领域
在创建领域之前,我们来简单介绍一下什么是领域。在Keycloak中,“领域(Realm)”指的是一个范围,用于汇集用户、角色、连接的数据存储(如LDAP)等。用户可以在领域内创建,并且可以在领域级别上定义身份验证方法等。默认情况下,有一个名为“Master”的领域,您可以使用它来管理所有后续添加的领域。”Master”领域是领域层次结构中的最高级别,可以由超级管理员(在初次安装时创建的管理员帐户)进行管理。
尽管可以使用「Master」领域来管理用户等,但基本上建议首先创建领域,因此请先创建领域。需要注意的是,「Master」领域也可以被删除。
请访问 http://localhost:8080/auth/admin/ ,使用管理员账户登录Keycloak管理控制台。
在位于左上角的下拉菜单中,显示为”Master”,点击”添加领域”。
点击进入添加领域页面。因为要创建一个新的领域,所以在领域名称中输入“demo”,然后点击“创建”按钮。
创建领域后,将转到管理控制台的主页。当前的领域应该是”demo”。
您可以点击左上角的下拉菜单,切换到管理下的主Realm和新创建的Realm。
1.2. 创建客户端
接下来,我们将创建一个客户端(※)。在本案例中,所谓客户端是指根据OIDC所规定的”Relying Party”(在基于OIDC 1.0的OAuth 2.0中也称之为”客户端”)即Spring Boot应用程序。
在左侧菜单栏上点击“客户”。客户列表页面将显示,然后点击“创建”按钮。
输入「sample-app」,然后点击「保存」按钮。
将「有效的重定向URI」输入为「http://localhost:8081/hello」。
1.3. 创建角色
接下来,我们将创建一个分配给用户的角色。稍后我们将进行配置,只有被分配了该角色的用户才能访问Spring Boot应用程序。
在左侧菜单栏中点击”角色”。角色列表页面将显示出来,然后点击”创建”按钮。
在「角色名称」栏中输入「用户」,然后点击「保存」按钮。
1.4. 用户创建和角色分配
最后,创建用户并分配角色。在左侧菜单栏中点击“用户”。打开用户列表界面后,点击“创建”按钮。
点击“用户添加”按钮,打开用户列表页面。用户列表为空,该按钮位于右侧。
只需输入必填的用户名,并点击“保存”按钮,即可打开新用户的管理页面。
接下来,我们要设置新用户的密码。请点击”凭据”选项卡。
输入新密码和确认密码后,将出现一个红色的“密码重置”按钮。此时,请将“临时”更改为“关闭”。这样一来,您将不再需要在首次登录时更改密码。
点击“重置密码”按钮,密码将会被重置。
最后,点击“角色映射”标签,将“可用角色”中的用户移动到“已分配角色”。
以上是Keycloak配置的完成。
2.1. 使用Spring Initializr创建应用程序的模板
接下来,我们将创建一个Spring Boot应用程序。为了创建Spring Boot应用程序的模板,我们将使用Spring Initializr。请访问Spring Initializr的页面。
请按照上方的屏幕输入和选择以下内容,然后点击“生成项目”按钮。
请将压缩文件下载后,解压缩到合适的目录中。
2.2. 创建类和HTML
首先,我们需要创建一个静态的主页HTML。在src/main/resources/static/目录下创建一个名为index.html的HTML文件,内容如下:
<html>
<head>
<title>Sample Application</title>
</head>
<body>
<h1>Sample Application</h1>
<a href="/hello">Go to hello page!</a>
</body>
</html>
接下来,我们将从这个界面创建一个控制器和屏幕。控制器将被创建在src/main/java/com/example/sampleapp/下,并以文件名HelloController.java的形式,具有以下内容。
package com.example.sampleapp;
import java.util.Locale;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
class HelloController {
@RequestMapping(value = "/hello")
public ModelAndView hello(HttpSession ses, ModelAndView mav, Locale locale) {
mav.setViewName("hello");
mav.addObject("message", "Hello! Spring Boot and Keycloak!");
return mav;
}
@RequestMapping(value = "/logout")
public String logout(HttpServletRequest request) throws ServletException {
request.logout();
return "redirect:/";
}
}
被这个控制器调用的页面将在src/main/resources/templates/目录下以hello.html命名的HTML文件中进行创建。
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:with="lang=${#locale.language}" th:lang="${lang}">
<h1>Hello</h1>
<p th:text="${message}" /><br />
<p>
<a href="/logout">Logout</a>
</p>
</html>
目录结构如下所示。
这样,示例Web应用程序就完成了。
2.3. 配置Keycloak与应用程序的整合。
最后,我们将对创建的Web应用程序进行与Keycloak的集成配置。请在/src/main/resources下的application.properties文件中添加以下定义。
keycloak.auth-server-url=http://localhost:8080/auth
keycloak.realm=demo
keycloak.public-client=true
keycloak.resource=sample-app
keycloak.security-constraints[0].authRoles[0]=user
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/hello/
server.port=8081
需要对http://localhost/hello/进行身份验证,并要求用户具备“user”角色。最后一个属性指定了此应用程序在端口8081上进行监听。
以上是所有设置的完成。
确认动作
那么,让我们进行操作确认。使用以下命令来启动您创建的Web应用程序。
对于Gradle而言,在Gradle的情况下
$ gradle bootRun
如果要用中文表达“Maven的情况”,可以说:依据Maven。
$ mvn spring-boot:run
当您访问http://localhost:8081时,会显示以下类似界面。
点击「Go to hello page!」链接后,将被重定向到Keycloak的登录页面。
请使用您创建的用户登录。如果之前的设置都正确完成了,将会显示下面这样的画面。
最后
将基于Spring Boot的Web应用程序的身份验证委托给Keycloak非常简单。这不仅容易,而且还实现了标准且安全的登录处理。
这次我们使用了Spring Boot Adapter,但也有一个叫Spring Security Adapter的东西,它包含在Spring Boot Keycloak Starter中。关于这一点,如果有机会的话,我们会在另一个场合进行解释。
文中所提到的資料与说话者的话题有关。
-
- Keycloak Documentation
-
- NRI OpenStandia Keycloak日本語ドキュメント – Keycloak 入門編
- Red Hat Developer Program Blog – Easily secure your Spring Boot applications with Keycloak