尝试在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提供者”。

env.png

在开始之前

在开始本教程前,您需要完成Keycloak的设置并创建管理员用户。请参考Keycloak Advent Calendar第2天的文章进行这些操作。另外,由于我们将使用Gradle或Maven来构建和启动Web应用程序,请提前安装其中之一。

此外,本次我们将在本地环境构建Keycloak和基于Spring Boot的Web应用程序。

合作流程

合作的步骤如下。完成后,进行操作确认。

    1. 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”领域是领域层次结构中的最高级别,可以由超级管理员(在初次安装时创建的管理员帐户)进行管理。

realm.png

尽管可以使用「Master」领域来管理用户等,但基本上建议首先创建领域,因此请先创建领域。需要注意的是,「Master」领域也可以被删除。

请访问 http://localhost:8080/auth/admin/ ,使用管理员账户登录Keycloak管理控制台。

2017-10-29 11.34.04 からのスクリーンショット.png

在位于左上角的下拉菜单中,显示为”Master”,点击”添加领域”。

2017-11-04 01.03.23 からのスクリーンショット.png

点击进入添加领域页面。因为要创建一个新的领域,所以在领域名称中输入“demo”,然后点击“创建”按钮。

2017-11-04 01.07.14 からのスクリーンショット.png

创建领域后,将转到管理控制台的主页。当前的领域应该是”demo”。

2017-11-04 01.10.35 からのスクリーンショット.png

您可以点击左上角的下拉菜单,切换到管理下的主Realm和新创建的Realm。

1.2. 创建客户端

接下来,我们将创建一个客户端(※)。在本案例中,所谓客户端是指根据OIDC所规定的”Relying Party”(在基于OIDC 1.0的OAuth 2.0中也称之为”客户端”)即Spring Boot应用程序。

※正確に言うと、クライアントのプロファイルを作成します。クライアント自体は、後述する「Spring Initializr」などを使って作成します。

在左侧菜单栏上点击“客户”。客户列表页面将显示,然后点击“创建”按钮。

2017-11-05 20.25.52 からのスクリーンショット.png

输入「sample-app」,然后点击「保存」按钮。

2017-11-05 20.26.06 からのスクリーンショット.png

将「有效的重定向URI」输入为「http://localhost:8081/hello」。

Screenshot from 2017-11-30 21-26-28.png

1.3. 创建角色

接下来,我们将创建一个分配给用户的角色。稍后我们将进行配置,只有被分配了该角色的用户才能访问Spring Boot应用程序。

ロールは、ユーザーの役割を意味し、ユーザーのタイプやカテゴリを識別するために利用します。管理者、ユーザー、マネージャー、従業員などが、組織内に存在する典型的なロールです。アプリケーションでは、ユーザーの管理が難しくならないように、個々のユーザーではなく特定のロールにアクセス権を割り当てることがよくあります。

在左侧菜单栏中点击”角色”。角色列表页面将显示出来,然后点击”创建”按钮。

2017-11-05 20.34.06 からのスクリーンショット.png

在「角色名称」栏中输入「用户」,然后点击「保存」按钮。

2017-11-05 20.34.29 からのスクリーンショット.png

1.4. 用户创建和角色分配

最后,创建用户并分配角色。在左侧菜单栏中点击“用户”。打开用户列表界面后,点击“创建”按钮。

点击“用户添加”按钮,打开用户列表页面。用户列表为空,该按钮位于右侧。

2017-11-04 01.36.39 からのスクリーンショット.png

只需输入必填的用户名,并点击“保存”按钮,即可打开新用户的管理页面。

2017-11-04 01.38.12 からのスクリーンショット.png

接下来,我们要设置新用户的密码。请点击”凭据”选项卡。

输入新密码和确认密码后,将出现一个红色的“密码重置”按钮。此时,请将“临时”更改为“关闭”。这样一来,您将不再需要在首次登录时更改密码。

2017-11-04 11.37.09 からのスクリーンショット.png

点击“重置密码”按钮,密码将会被重置。

最后,点击“角色映射”标签,将“可用角色”中的用户移动到“已分配角色”。

2017-11-05 21.48.03 からのスクリーンショット.png

以上是Keycloak配置的完成。

2.1. 使用Spring Initializr创建应用程序的模板

接下来,我们将创建一个Spring Boot应用程序。为了创建Spring Boot应用程序的模板,我们将使用Spring Initializr。请访问Spring Initializr的页面。

2017-11-05 20.42.16 からのスクリーンショット.png

请按照上方的屏幕输入和选择以下内容,然后点击“生成项目”按钮。

項目設定値ProjectGradle ProjectまたはMaven Project言語JavaDependenciesWeb、Thymeleaf、DevTools、KeycloakGroupcom.exampleArtifactsample-app

请将压缩文件下载后,解压缩到合适的目录中。

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>

目录结构如下所示。

2017-11-05 21.02.14 からのスクリーンショット.png

这样,示例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时,会显示以下类似界面。

2017-11-05 22.10.02 からのスクリーンショット.png

点击「Go to hello page!」链接后,将被重定向到Keycloak的登录页面。

2017-11-05 22.04.53 からのスクリーンショット.png

请使用您创建的用户登录。如果之前的设置都正确完成了,将会显示下面这样的画面。

2017-11-05 22.11.56 からのスクリーンショット.png

最后

将基于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
mark.png
广告
将在 10 秒后关闭
bannerAds