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/WebServerFactoryCustomizer
	at 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异常。

发布了272 篇原创文章 · 获赞 371 · 访问量 126万+

猜你喜欢

转载自blog.csdn.net/tuzongxun/article/details/96979245