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

相关文章

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔