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異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章