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

相关文章

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t