keycloak使用及sprinboot集成客户端记录(一)

2024-04-28 06:58

本文主要是介绍keycloak使用及sprinboot集成客户端记录(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、SSO

SSO,中文名称“单点登录”,英文全称是SingleSignOn。个人理解,大概就是统一入口登录、统一用户和鉴权管理、共用服务认证的意思。百度百科的标准解释如下:

单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其他联邦系统和应用软件的权限。
同时这种实现是不需要管理员对用户的登录状态或其他信息进行修改的,这意味着在多个应用系统中,用户只需一次登录就可以访问所有相互信任的应用系统。这种方式减少了由登录产生的时间消耗,辅助了用户管理,是目前比较流行的。

单点登录是一项很具有通用性的需求,因此市面上有不少对应的开源解决方案,个人目前接触到的就有两个,一个是CAS,一个是keycloak,keycloak也是这一次学习的重点。

二、keycloak基础集成参考文档:

keycloak的官方文档个人觉得还是很给力的,很多东西都不需要额外去其他地方搜资料,因此基础集成基本直接参考官网文档就行了,以下是个人使用springboot整合的过程中主要参考的官网文档:
https://www.keycloak.org/docs/latest/getting_started/index.html
https://www.keycloak.org/docs/latest/securing_apps/index.html#_spring_boot_adapter

由于官网在集成步骤上的说明已经很详细,所以基本步骤似乎就没必要再抄一遍。
从大的步骤来说,基本就两步:
一步是下载、配置和启动keycloak服务端,然后参考上边链接里的文档在服务端UI界面进行各种配置;
另一步就是在客户端集成keycloak。

所不同是,官方入门指导里只是最简单的示例,因此在一些细节上还是有不少问题存在。以下是初步集成过程中的问题记录:

三、问题记录

1、客户端springboot1.5集成和2.0集成keycloak的区别

由于目前项目的各种限制,springboot的版本还是基于1.5的,因此我刚开始也是使用的这个版本的springboot,然后参考官方文档集成客户端,主要是引入如下两个maven配置:
<pre>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-spring-boot-starter</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.keycloak.bom</groupId>
<artifactId>keycloak-adapter-bom</artifactId>
<version>6.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

但是集成之后一直启动报错:

java.lang.NoClassDefFoundError: org/springframework/boot/web/server/WebServerFactoryCustomizerat java.lang.Class.getDeclaredMethods0(Native Method) ~[na:1.8.0_201]at java.lang.Class.privateGetDeclaredMethods(Unknown Source) ~[na:1.8.0_201]at java.lang.Class.getDeclaredMethods(Unknown Source) ~[na:1.8.0_201]

找了很多资料没找到原因后,请教了下之前踩过坑的同事,才知道是版本问题,然后把springboot版本改为2.0后再试,果然启动成功,并且正常使用。
但是其他项目都是1.5的springboot,不太可能突然都升级,因此实际上springboot版本还是需要1.5才行,最终找到了1.5版本springboot集成的正确配置,不再需要上边dependencyManagement的配置,然后把keycloak-spring-boot-starter依赖改为下边的配置:

<dependency><groupId>org.keycloak</groupId><artifactId>keycloak-legacy-spring-boot-starter</artifactId><version>6.0.1</version>
</dependency>

2、服务端H2数据库改为mysql的配置问题

如何把keycloak自带的嵌入式数据库H2改为其他数据库,官网文档也有一定的说明,也算是比较详细,但是有些细节依然会导致各种问题出现。我们项目中目前使用的基本都是mysql,因此这里要改的话自然也是改为mysql来试验,集成过程中就发现有两个问题:

2.1、jar版本问题

官网没有说数据库版本要怎样,只说了需要驱动包,因此我一开始是直接把项目里5.1.46版本的mysql拿过来用了,结果服务端就启动不了。
后来各种查资料后,服务端mysql驱动换成mysql-connector-java-8.0.11.jar,并多次试验后证明确实这个版本可以,而5.1.46的不行。

2.2、数据库连接url中serverTimeZone必带的问题

无论是官网还是网上大多数资料,似乎都没有提mysql连接时serverTimeZone这个url参数的问题,但实际使用时发现不带这个参数启动服务端就会抛出如下异常:
java.lang.RuntimeException: WFLYCTL0195: Interrupted awaiting transaction commit or rollback
因此,实际的mysql连接url应该是如下这样:
jdbc:mysql://localhost:3306/keycloak?useSSL=false&serverTimezone=GMT%2B8&characterEncoding=UTF-8

3、关于客户端public和confidential配置的问题

在keycloak的服务端ui界面创建和配置客户端的时候,有三种类型可选,分别是public、confidential和bearer-only,public是官网示例以及很多其他网络资料教程里的类型,bearer-only有一定的限制,所以基本就暂时尝试了public和confidential类型。
需要注意的是,使用public类型是,springboot客户端配置必须下边这个配置:

keycloak.public-client=true

而使用confidential类型时,需要去掉这个配置,否则就会403异常。

这篇关于keycloak使用及sprinboot集成客户端记录(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/942576

相关文章

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所