Spring Boot 3.1中如何整合Spring Security和Keycloak

来源:https://www.cnblogs.com/didispace/archive/2023/06/01/17448193.html
-Advertisement-
Play Games

在今年2月14日的時候,Keycloak 團隊宣佈他們正在棄用大多數 Keycloak 適配器。其中包括Spring Security和Spring Boot的適配器,這意味著今後Keycloak團隊將不再提供針對Spring Security和Spring Boot的集成方案。但是,如此強大的Ke ...


在今年2月14日的時候,Keycloak 團隊宣佈他們正在棄用大多數 Keycloak 適配器。其中包括Spring Security和Spring Boot的適配器,這意味著今後Keycloak團隊將不再提供針對Spring Security和Spring Boot的集成方案。但是,如此強大的Keycloak,還要用怎麼辦呢?本文就來聊聊,在最新的Spring Boot 3.1版本之下,如何將Keycloak和Spring Security一起跑起來。

準備工作

這裡所採用的框架與工具版本信息如下:

  • Spring Boot 3.1.0
  • Keycloak 21.1.1

如果您採用的是其他版本,本文內容不一定有效,但可以作為參考。

配置Keycloak

第一步:為Spring Boot應用創建Realm,併在下麵創建一個Client

第二步:創建一個SYS_ADMIN角色,並創建一個用戶賦予SYS_ADMIN角色

第三步:調用Keycloak介面生成Access Token,可以用下麵的curl命令或者其他任何發請求的工具,比如:Postman等。

curl --location 'http://localhost:9090/realms/MyAppRealm/protocol/openid-connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'username=<YOUR_USER_NAME>' \
--data-urlencode 'password=<YOUR_USER_PASSWORD>' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'client_id=My-Awesome-App' \
--data-urlencode 'client_secret=<KEYCLOAK_CLIENT_SECRET>' \
--data-urlencode 'scope=openid'

記住獲得到Access Token,後續驗證時候要用。

如果您學習過程中如遇困難?可以加入我們超高質量的Spring技術交流群,參與交流與討論,更好的學習與進步!

配置Spring Boot應用

第一步:創建一個Spring Boot應用,這個很簡單,這裡不贅述了。如果您還不會,可以看看我的Spring Boot教程

第二步:在pom.xml中添加依賴:

<dependency>
   <groupId>org.springframework.security</groupId>
   <artifactId>spring-security-oauth2-jose</artifactId>
</dependency>

第三步:修改配置文件

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: http://localhost:9090/realms/MyAppRealm
          jwk-set-uri: http://localhost:9090/realms/MyAppRealm/protocol/openid-connect/certs

第四步:創建一個需要鑒權的測試介面

@RequestMapping("/test")
@RestController
public class MySuperSecuredController {

    @GetMapping("/hello")
    public String hello(){
        return "hello";
    }

}

第五步:創建SecurityFilterChain,用來告知Spring Security在JWT令牌中查找角色信息的位置。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {


    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                .authorizeHttpRequests(registry -> registry
                        .requestMatchers("/test/**").hasRole("SYS_ADMIN")
                        .anyRequest().authenticated()
                )
                .oauth2ResourceServer(oauth2Configurer -> oauth2Configurer.jwt(jwtConfigurer -> jwtConfigurer.jwtAuthenticationConverter(jwt -> {
                    Map<String, Collection<String>> realmAccess = jwt.getClaim("realm_access");
                    Collection<String> roles = realmAccess.get("roles");
                    var grantedAuthorities = roles.stream()
                            .map(role -> new SimpleGrantedAuthority("ROLE_" + role))
                            .toList();
                    return new JwtAuthenticationToken(jwt, grantedAuthorities);
                })))
        ;

        return httpSecurity.build();
    }
}

驗證一下

在完成了上面配置所有之後之後,啟動Spring Boot應用,同時保證Keycloak也在運行中。

嘗試請求/test/hello介面:

  • 當不包含Authorization頭信息的時候,將返回401錯誤
  • 當包含Authorization頭信息(前文用調介面獲取的Access Token)的時候,才能正確訪問到。

小結

雖然Keycloak 團隊宣佈了不再對Spring Security提供適配,但Spring Security長期以來一直為OAuth和OIDC提供強大的內置支持。所以,只要我們理解Spring Security是如何處理OAuth和OIDC的,那麼與Keyloak的集成依然不複雜。好了,今天的分享就到這裡!如果您學習過程中如遇困難?可以加入我們超高質量的Spring技術交流群,參與交流與討論,更好的學習與進步!

歡迎關註我的公眾號:程式猿DD。第一時間瞭解前沿行業消息、分享深度技術乾貨、獲取優質學習資源


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • > 本文首發於公眾號:Hunter後端 > 原文鏈接:[celery筆記一之celery介紹、啟動和運行結果跟蹤](https://mp.weixin.qq.com/s/o6enPH4f1qo8WXrl9vO-1w) 本篇筆記內容如下: 1. celery 介紹 2. celery 準備 3. ce ...
  • 在筆者上一篇文章`《驅動開發:內核解析PE結構導出表》`介紹瞭如何解析記憶體導出表結構,本章將繼續延申實現解析PE結構的PE頭,PE節表等數據,總體而言內核中解析PE結構與應用層沒什麼不同,在上一篇文章中`LyShark`封裝實現了`KernelMapFile()`記憶體映射函數,在之後的章節中這個函數... ...
  • Consul 通過 Key/Value 功能集中管理存儲配置信息, 通過 Spring Cloud Consul Config 可以實現 Config Server 和 Client 的關聯. 在 Spring 啟動的 bootstrap 階段, 配置會被載入環境上下文. ...
  • # 1. 前言 最近有點時間,就隨便找點東西弄弄,倒也碰到了一些問題,在此記錄下 # 2. 環境 Python3.11.3 + selenium4.9.1 + opencv4.7 + PyAutoGUI0.9.54 + windows11 # 3. 開始 ## 3.1 賬號密碼輸入 ![image] ...
  • 有時候我們使用python自動化框架的時候,打開一個網頁的時候,它會出現出線這一種登錄框,我們f12檢查不了,用開發者工具強制檢查裡面沒有任何屬性. 那這時候我們就可以用到python第三方庫:pyautogui PyAutoGUI:是一個Python庫,可用於自動化GUI(圖形用戶界面)程式的任務 ...
  • 本文介紹基於**Python**中**ArcPy**模塊,對大量柵格遙感影像文件**批量**進行**無效值**(**NoData**值)填充的方法。 在處理柵格圖像文件時,我們經常會遇到圖像中存在有無效值(即**NoData**值)的情況。如下圖所示,這裡有一個**矢量面要素圖層**和該矢量圖層範圍 ...
  • 我們在初學 Java 編程的時候,總是感覺很枯燥乏味,想著做點可以交互的小系統,可以讓用戶自由輸入,系統可以接收做出反映。這就要介紹一下 Java 中的 Scanner 類了。 ...
  • 通過python來開發web應用,可以產簡化了web開發的流程,功能和函數庫也是非常豐富,我們也是開箱即用,目前比較流程的WEB框架就是Flask和django。 > 根據2020年JetBrains Python開發人員調查,Django和Flask是迄今為止最受歡迎的兩個Python Web框架 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...