杂记 | 使用keycloak实现SSO单点登录(新手向,概念、原理、逻辑、详细步骤、难点解释)

news2024/11/25 7:52:19

文章目录

  • 01 单点登录的概念
  • 02 keycloak的中的相关概念
    • 2.1 概念之间的关系
    • 2.2 案例说明
  • 03 如何使用keycloak实现单点登录
    • 3.1 步骤与效果说明
    • 3.2 环境说明
  • 04 操作步骤
    • 4.1 在服务器上创建并启动keycloak服务
    • 4.2 创建一个领域
    • 4.3 创建一个客户端
    • 4.4 获取客户端适配器配置
    • 4.5 创建一个用户
    • 4.6 创建第一个应用
    • 4.7 创建第二个应用
    • 4.8 单点登录测试
  • 05 回顾与说明
    • 5.1 关于adapter配置文件
    • 5.2 关于重定向地址
    • 5.3 关于报错PKIX path building failed


之前几篇有关keycloak的文章:

keycloak的介绍和基本概念

Linux服务器使用docker安装keycloak(docker-compose)

使用Docker快速上手Keycloak(官方文档翻译)

01 单点登录的概念

先用案例说明:

假设有一个大型企业,该企业使用了多个内部应用程序和服务,包括员工门户、邮箱、人力资源系统、财务系统等。在没有单点登录的情况下,每个应用程序都需要员工单独登录,这会导致以下问题:

  1. 用户体验糟糕:员工需要记住多个不同的用户名和密码,并且在每次登录时都需要输入这些凭据,这增加了用户的负担和登录过程的时间。

  2. 安全性问题:如果员工为了方便而使用相同或类似的密码,一旦其中一个应用程序被攻破,攻击者可能会访问到其他应用程序,因为相同的凭据可在所有应用程序上使用。

  3. 密码管理困难:员工可能会频繁地忘记密码,导致需要重置密码的请求增多,增加了IT部门的工作量。

而单点登录技术就是为了解决这些问题而出现的。

概念
单点登录(Single Sign-On,简称SSO)是一种身份验证和授权机制,允许用户在多个应用程或服务之间使用同一组凭据(例如用户名和密码)进行登录,而不需要在每个应用程序中都输入凭据。使用SSO,用户只需要在一次登录后,即可访问连接到SSO系统的所有其他应用程序,简化了用户体验,提高了安全性,并减少了密码管理的负担。

上述案例中,实施单点登录后,员工只需在第一次访问其中一个应用程序时输入其用户名和密码。之后,当员工访问连接到SSO系统的其他应用程序时,无需再次输入凭据。解决了分别登录出现的问题。

02 keycloak的中的相关概念

2.1 概念之间的关系

在我之前的文章中,介绍了keycloak中核心的一些概念。

在此,我用思维导图的方式将这些概念进行整合:

在这里插入图片描述

  • keycloak
    实现身份与访问的一整套解决方案。具体而言,它是搭建在某台服务器上的一个服务实例,可以通过管理控制台进行管理和配置。

  • realm 领域
    领域是keycloak中专门用来管理项目的工作区,每个Keycloak实例可以包含一个或多个领域,每个领域是一个独立的安全域,不同领域之间的资源相互隔离。领域分为两类,一类是master领域,由Keycloak刚启动时创建,用于管理admin账号以及创建其他的领域;另一类是用户自己创建的普通领域,用于管理具体的项目和用户。

  • client 客户端
    客户端在领域中创建,一个领域可以创建多个客户端,例如一个企业可以创建两个客户端:销售人员客户端、研发人员客户端。在具体的客户端中管理具体的应用程序。

  • application 应用程序
    一个客户端可以配置一至多个应用程序,同一客户端下的多个应用程序可以实现单点登录。一个应用程序可以是SpringBoot应用、JavaScript应用、Android应用等。

  • adapter 适配器
    适配器,用来实现客户端与Keycloak之间的集成。具体而言,同一客户端下的应用共用一个客户端适配器的配置,这也确保了单点登录的实现。

2.2 案例说明

如果对这些概念的关系还是比较生疏,下面通过一个例子进行说明:

假设有一家大型公司,使用keycloak管理用户身份服务,公司系统中的使用者分为客户和员工两大类。系统中有许多应用,则可能的配置如下:
在这里插入图片描述
在这个公司系统中,有三个领域,分别是:master、consumer、employee,在employee领域下,存在两个客户端,分别是前台销售客户端和后台管理客户端。

前台销售客户端面向前台销售人员使用,其下有3个应用程序,这三个应用程序可能是使用不同的框架实现的,例如一个使用SpringBoot搭建,另一个使用Node.js。

这3个应用程序有各自的适配器,但每个适配器配置的内容都适配到“前台销售”这个客户端,这样个应用程序就可以实现单点登录了。

关于适配器中配置的具体内容,接下来会提到。

03 如何使用keycloak实现单点登录

3.1 步骤与效果说明

因为仅作为演示,会尽量排除与单点登录无关的配置和操作,集中理解单点登录需要的操作。

步骤:

  1. 搭建keycloak服务
  2. 创建一个领域
  3. 创建一个客户端
  4. 创建一个用户
  5. 创建两个应用并配置适配器

要实现的效果:
登录其中一个客户端后,另一个客户端不用登录也可访问。

3.2 环境说明

本次演示使用2台主机,一台是云服务器,另一台是本地主机,keycloak部署在云服务器,两个应用分别部署在本地和云服务器。
作为学习,也可所有服务与应用都部署在本地。

04 操作步骤

4.1 在服务器上创建并启动keycloak服务

详见:Linux服务器使用docker安装keycloak(docker-compose)

4.2 创建一个领域

在这里插入图片描述
在这里插入图片描述

4.3 创建一个客户端

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.4 获取客户端适配器配置

所有使用该配置的应用被视为属于这一客户端
在这里插入图片描述
点击Download adapter config
在这里插入图片描述
在这里插入图片描述
下载或记住这一客户端的配置,之后创建应用时使用。

4.5 创建一个用户

在这里插入图片描述
给用户设置一个密码
在这里插入图片描述

4.6 创建第一个应用

创建第一个应用,名为keycloak_sso_local。
在这里插入图片描述
编辑pom.xml文件
在这里插入图片描述
加入依赖配置

<dependencies>
    ...
    <!--keycloak-->
    <dependency>
        <groupId>org.keycloak</groupId>
        <artifactId>keycloak-spring-boot-starter</artifactId>
    </dependency>
</dependencies>

<!--keycloak-->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.keycloak.bom</groupId>
            <artifactId>keycloak-adapter-bom</artifactId>
            <version>21.1.1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

编写controller

@RestController
public class LocalController {
   @GetMapping("/")
   public String withoutLogin() {
       return "未登录可以看到此页面";
   }
   @GetMapping("/local")
   public String login() {
       return "您已登录local应用";
   }    
}

编写application.yml

# 以下配置参考刚才下载的adapter配置(本文4.4部分)
keycloak:
  realm: myrealm
  auth-server-url: https://xxx.xxx.xxx.xxx:8443/
  ssl-required: external
  resource: myclient
  public-client: true
  confidential-port: 0
  # 设置以下资源需要登录才能访问
  security-constraints:
    - auth-roles:
        - default-roles-myrealm # 用户创建后的默认角色
      security-collections:
        - patterns:
            - /local/*

编写好后,在本地启动该应用,测试能否访问:
浏览器地址栏输入http://localhost:8080
在这里插入图片描述
然后再输入要访问的资源链接http://localhost:8080/local,此时会重定向到登录页面
在这里插入图片描述
在这里插入图片描述
跳转到的登录页面的地址是keycloak服务所在的服务器ip/域名。
输入刚才创建的用户名(myuser)和密码,点击登录,登录成功后重定向回localhost(创建领域时配置过)
可以成功访问到http://localhost:8080/local
在这里插入图片描述

4.7 创建第二个应用

第一个应用创建成功并能正常运行和访问,接下创建第二个应用。
创建步骤和第一个应用一致,不同的地方:

  • 应用名设置为keycloak_sso_remote。(便于区分)
  • Controller中第二个接口改为
    @GetMapping("/remote")
    public String login() {
        return "您已登录remote应用";
    }    
    
  • application.yml文件
keycloak:
  realm: myrealm
  auth-server-url: https://43.136.98.253:8443/
  ssl-required: none			# 改成了none
  resource: myclient
  public-client: true
  confidential-port: 0
  # 设置以下资源需要登录才能访问
  security-constraints:
    - auth-roles:
        - default-roles-myrealm # 用户创建后的默认角色
      security-collections:
        - patterns:
            - /remote/*			# 改成了remote

创建好后,将第二个应用上传到服务器并启动,测试可访问性。

4.8 单点登录测试

首先在本地和服务器同时启动服务。
然后在本地主机上打开浏览器,分别开启两个窗口,输入对应地址。
在这里插入图片描述
接着,在左侧的浏览器地址栏输入路径http://localhost:8080/local,进行登录。
登录成功后,右侧输入地址http://ip:8080/remote
在非单点的情况下,左侧和右侧需要分别登录,我们成功配置了单点登录,左侧登录成功后,右侧就可以直接访问了,不需要再次登录。
在这里插入图片描述
(先右后左同理)

05 回顾与说明

5.1 关于adapter配置文件

在keycloak控制台的某一具体客户端右上角导出的配置文件,记录了该客户端基本的信息,最重要的信息有3个:

  • auth-server-url 认证服务地址
  • realm 领域名称
  • resource 客户端名称

这三项信息唯一确定了一个客户端,因此,如果2个应用的适配器配置中这三项的配置相同,那么这2个应用就属于同一客户端下的应用,这2个应用之间也就可以实现单点登录。

在SpringBoot项目中,application.yml中关于keycloak的配置,即为应用适配器在SpringBoot应用中的的具体形式,在其他应用中可能是其他形式。

5.2 关于重定向地址

在创建客户端时,设置了2个重定向地址:
在这里插入图片描述
这两个地址是在何处起了什么作用?
当一个请求访问本地应用的某个资源(例如/local这个资源),因为在适配器(application.yml)中配置了该资源需要登录才能访问,而该请求未登录,此时应用会跳转到keycloak的登录页面(适配器中配置了auth-server-url,应用会通过该配置获取客户端上的详细配置,记载了要跳转的登录页面在哪里),登录成功后,会跳转到某个地址,这里的跳转地址就是我们设置的重定向地址。

5.3 关于报错PKIX path building failed

如果部署keycloak服务的服务器使用了https,但没有可信的https证书,则会出现该错误,解决方法参考我的另一篇:报错 | PKIX path building failed: …SunCertPathBuilderException:unable to find valid certification…

最好是使用有可信证书的https和域名访问,可以避免许多麻烦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/718237.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C. Logo Turtle (DP,思维)

传送门 题意&#xff1a; 给一个含有T、F的字符串&#xff0c;T表示转向&#xff0c;F表示前进1格。现在可以把其中的T改为F&#xff0c;或F改为T&#xff0c;改变n次&#xff08;可重复改变某一位置的字母&#xff09;&#xff0c;问相对于起点最远能走多远。 思路&#xff…

quilt data 安装 数据包 框架

安装 Quilt 有两个用户可见的组件&#xff1a; 一个 Python 客户端一个 Web 目录 Python 客户端 需要 Python 3.7 或更高版本。 $ pip install quilt3[pyarrow]Mental Model Quilt 数据包的思维模型 Quilt 将数据集表示为数据包。一个数据包是一个不可变的相关文件集合&a…

Redis的主从复制、哨兵、cluster集群

Redis 主从复制 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(Master)&#xff0c;后者称为从节点(Slave)&#xff1b;数据的复制是单向的&#xff0c;只能由主节点到从节点。 默认情况下&#xff0c;每台Redis服务…

JAVA关于多线程的学习

1.创建线程的方法(这里不考虑继承Thread类) 通过实现Runnable接口的方式实现 public class MyRunnable implements Runnable{Overridepublic void run() {for (int i 0; i < 5; i) {System.out.println(Thread.currentThread().getName()"执行了....");}} }pub…

基于.Net Core微服务-第1章:说明及技术栈

微服务是一种架构模式&#xff0c;提倡将单一应用程序划分为一组小的服务&#xff0c;服务相互协调、互相配合&#xff0c;为用户提供最终价值。

vulnhub-ripper(易)

打靶练习Ripper&#xff0c;这是一个中低的靶场 0x00 部署0x01 信息收集&#xff1a;端口扫描、服务发现0x02路径扫描0x03 总结 0x00 部署 靶机&#xff1a;下载地址 宿主机&#xff1a;kali2021版本 0x01 信息收集&#xff1a;端口扫描、服务发现 sudo arp-scan -l #探测存…

【每日随笔】摩托车驾驶 ④ ( 德州增驾摩托车 D 本记录 | 考场位置 “ 德州市公安局交警支队直属四大队车辆管理所 “ )

文章目录 一、进入考场二、科目一三、科目二1、推车 ( 找准车辆停放位置 )2、上车前检查 ( 开始考试前准备 )3、科目二考试开始4、科目二路线要求5、坡起6、绕桩7、单边桥 四、科目三教学1、推车 ( 找准车辆停放位置 )2、上车前检查 ( 开始考试前准备 )3、科目三考试开始4、科目…

NSS [SWPUCTF 2021 新生赛]Do_you_know_http

NSS [SWPUCTF 2021 新生赛]Do_you_know_http 先看题目&#xff0c;应该是伪造XFF&#xff0c;UA等东西。 postman一把梭。

Bootloader Design of PIC18 series MCU

注意&#xff1a;下列描述是在PIC单片机上启用Bootloader的一个相关知识的近似完备集。所有需要了解的&#xff0c;bootloader与用户态程序交互的理论知识都已给出。 1.概述 嵌入式产品化后&#xff0c;需要考虑现场升级&#xff0c;单片机如果需要添加现场升级功能&#xff…

linux+win——嵌套虚拟机性能测试

参考博文&#xff1a;CSDN-Violent-Ayang&#xff08;作者&#xff09;-UNIX BENCH详细安装及使用步骤 unix bench wget http://175.6.32.4:88/soft/test/unixbench/unixbench-5.1.2.tar.gz tar -xzvf unixbench-5.1.2.tar.gz cd unixbench-5.1.2 vim Makefile # 将 Makefile 中…

虹科方案 | Redis Enterprise:适用于任何企业的矢量数据库解决方案

用户希望他们遇到的每个应用程序和网站都具有搜索功能。然而&#xff0c;超过80%的业务数据是非结构化的&#xff0c;以文本、图像、音频、视频或其他格式存储。因此&#xff0c;我们需要一种跨非结构化数据的搜索方式。 什么是矢量数据库&#xff08;vector database&#xff…

【自动化测试教程】 —— pytest 框架详解 ~

pytest框架 特点: 容易上手, 入门简单, 文档丰富, 文档中有很多参考案例支持简单的单元测试和复杂的功能测试支持参数化执行测试用例过程中, 支持跳过操作支持重复失败的case支持运行Nose, unittest编写测试用例pytest支持很多第三方插件方便和持续集成工具集成 1. pytest断…

如何搭建独享的IP代理池?

随着互联网技术的日趋成熟&#xff0c;爬虫已经成为一种常见的数据获取方法。在采集业务中&#xff0c;建立本地IP代理池是非常重要的。今天将与您探讨IP代理池的选择以及如何搭建独享的IP代理池。 独享IP代理池是指由客户单独使用的IP池&#xff0c;优点是客户可以享受池中所…

关于opencv中cv2.imread函数读取的图像shape问题

图像坐标系是&#xff08;w,h&#xff09;,w为x轴&#xff0c;h为y轴,(x,y) 但opencv读出来的数组却正好相反&#xff0c;是&#xff08;h,w,3&#xff09;,(y,x,3) 所以这里会有一个转换 image cv2.imread(1.jpg) print(image.shape[0:2]) ##输出&#xff08;365,500&#x…

【操作系统】Linux编程 - 多线程的创建和使用 II (临界区 、互斥量、信号量的使用)

临界区的概念 之前的实例中我们只尝试创建了1个线程来处理任务&#xff0c;接下来让我们来尝试创建多个线程。 不过&#xff0c;还是得先拓展一个概念——“临界区” 临界区指的是一个访问共用资源&#xff08;例如&#xff1a;共用设备或是共用存储器&#xff09;的程序片段&…

哈工大计算机网络课程网络层协议详解之:Internet路由BGP协议详解

哈工大计算机网络课程网络层协议详解之&#xff1a;BGP协议详解 在之前的网络层协议中&#xff0c;我们介绍了Internet网络两个自治系统内的路由协议&#xff1a;RIP协议和OSPF协议。这两个协议应该来说是自治系统内协议的两个代表性协议&#xff0c;前一个基于距离向量路由算…

优化内存利用:深入了解垃圾回收算法与回收器

&#x1f52d; 大家好&#xff0c;我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&#xff1a;JVM &am…

机器学习面试题- 特征工程

目录标题 1、为什么要对特征做归一化2、对特征归一化的方法2.1 线性函数归一化2.2 零均值归一化 3、对数据预处理时&#xff0c;如何处理类别型特征3.1 序号编码3.2 独热编码3.3 二进制编码 4、什么是组合特征&#xff1f;如何处理高维组合特征&#xff1f;5、怎样有效地找到组…

​python接口自动化(十)--post请求四种传送正文方式(详解)​

简介 post请求我在之前的文章已经讲过一部分了&#xff0c;主要是发送一些较长的数据&#xff0c;还有就是数据比较安全等。我们要知道post请求四种传送正文方式首先需要先了解一下常见的四种编码方式&#xff1a; HTTP 协议规定 POST 提交的数据必须放在消息主体&#xff08;…

SpringBoot处理全局异常详解(全面详细+Gitee源码)

前言&#xff1a;在日常的开发工作中&#xff0c;项目在运行过程中多多少少是避免不了报错的&#xff0c;对于报错信息肯定不可以把全部信息都抛给客户端去显示&#xff0c;这里就需要我们对常见的七种异常情况统一进行处理&#xff0c;让整个项目更加优雅。 目录 一、基本介绍…