Spring Authorization Server授權伺服器入門

来源:https://www.cnblogs.com/felordcn/archive/2022/04/13/16139504.html
-Advertisement-
Play Games

11月8日Spring官方已經強烈建議使用Spring Authorization Server替換已經過時的Spring Security OAuth2.0,距離Spring Security OAuth2.0結束生命周期還有小半年的時間,是時候做出改變了。目前Spring Authorizati ...


11月8日Spring官方已經強烈建議使用Spring Authorization Server替換已經過時的Spring Security OAuth2.0,距離Spring Security OAuth2.0結束生命周期還有小半年的時間,是時候做出改變了。目前Spring Authorization Server已經進入生產就緒階段。今天跟著胖哥的節奏搞一搞Spring Authorization Server授權伺服器框架。

目前Spring Security的體系

在目前的Spring Security 5.x中將OAuth2.0 ClientOAuth2.0 Resource Server進行了模塊化。
Spring Security是一定要引入的。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

如果你要增加OAuth2.0 Client支持,可以引入:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-client</artifactId>
        </dependency>

如果需要OAuth2.0 Resource Server支持,可以引入:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-oauth2-resource-server</artifactId>
        </dependency>

現在如果你要增加OAuth2.0 Authorization Server支持的話,額外引入下麵的依賴就可以了:

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-oauth2-authorization-server</artifactId>
        <!--  截至現在版本  -->
            <version>0.2.0</version>
        </dependency>

至此OAuth2.0三大模塊齊活了。

Spring Authorization Server

我們的重點還是回到Spring Authorization Server上,目前該項目已經具備生產就緒能力。研究了幾天後,簡單出了一個DEMO,來幫助希望學習該框架的同學來理解它。

DEMO的流程

本DEMO將對OAuth 2.0的授權碼模式(authorization_code)進行演示。這裡分兩個項目;

  • oauth2-client項目,顧名思義作為OAuth2.0 Client,發起對授權伺服器的請求授權。
  • oauth2-server項目,基於Spring Authorization Server搭建的授權伺服器,提供授權服務。

用戶首先通過/oauth2/authorization/{registrationId}端點向oauth2-client發起請求:

GET /oauth2/authorization/felord HTTP/1.1
Host: 127.0.0.1:8080

OAuth2AuthorizationRequestRedirectFilter攔截後組裝成下麵的請求鏈接向授權伺服器oauth2-server發起授權碼授權:

GET /oauth2/authorize?response_type=code&client_id=felord-client&scope=message.read%20message.write&state=0CI0ziUDEnqMgqW0nzRNRCzLrs-9IMbqJzGZ47Zb0gY%3D&redirect_uri=http://127.0.0.1:8080/foo/bar HTTP/1.1
Host: localhost:9000

授權伺服器oauth2-server攔截到該請求後,會先檢查發起該請求的當前用戶是否認證。如果沒有認證就拋出401,跳到授權伺服器的登錄頁面,然後用戶執行了登錄:

POST /login HTTP/1.1
Host: localhost:9000
Content-Type: application/x-www-form-urlencoded

username=felord&password=password&_csrf=301a7baf-9e9a-4b17-acd4-613c809bf7f5

成功登錄後進行了302跳轉,繼續執行/oauth2/authorize授權請求。這時會判斷授權請求是否需要用戶授權確認,在本DEMO中用戶授權是需要二次確認的,會跳轉到下麵這個頁面:

Spring Authorization Server授權確認頁面

同意授權後,授權伺服器會調用redirect_uri並攜帶一個codestateoauth2-client發起請求:

GET /foo/bar?code=MCSJnvhXNyjilBaCyw1sCrrArWk1bzsEdxe5Z3EFbkdLwp8ASmum62n4M7Tz45VNpp_16IWboBnXlgG3LEfgN7MQqkf0-vVZufGrQpvRioRcBbesAiawMt4cspTk06ca&state=-fRunxjpG0aziPXnfcW1Iw1Fy_5_NwlUAgxABPOfAb8= HTTP/1.1 
Host: 127.0.0.1:8080

oauth2-clientOAuth2AuthorizationCodeGrantFilter攔截到redirect_uri後向授權伺服器發起/oauth2/token請求:

POST /oauth2/token?grant_type=authorization_code&code=MCSJnvhXNyjilBaCyw1sCrrArWk1bzsEdxe5Z3EFbkdLwp8ASmum62n4M7Tz45VNpp_16IWboBnXlgG3LEfgN7MQqkf0-vVZufGrQpvRioRcBbesAiawMt4cspTk06ca&redirect_uri=https://127.0.0.1:8080/foo/bar HTTP/1.1Host: localhost:9000Authorization: Basic bWVzc2FnaW5nLWNsaWVudDpzZWNyZXQ=

這裡採用的認證方式是client-authentication-method: client_secret_basic方式,詳見OAuth2.0協議。

授權伺服器將Token返回給客戶端,完成請求,認證客戶端信息如下:

認證客戶端信息

到此基於Spring Authorization Server整個授權碼流程完成了。

DEMO地址:https://gitee.com/felord/spring-security-oauth2-tutorial

關註公眾號:Felordcn 獲取更多資訊

個人博客:https://felord.cn

博主:碼農小胖哥
出處:felord.cn
本文版權歸原作者所有,不可商用,轉載需要聲明出處,否則保留追究法律責任的權利。如果文中有什麼錯誤,歡迎指出。以免更多的人被誤導。

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

-Advertisement-
Play Games
更多相關文章
  • 第一章正則表達式 1.3 1.3.12 使用sub()和subn()搜索與替換 在最後一段,文中提到: “前面講到,使用匹配對象的group()方法除了能夠取出匹配分組編號外,還可以使用\N,其中 N 是在替換字元串中使用的分組編號。下麵的代碼僅僅只是將美式的日期表示法MM/DD/YY{,YY}格式 ...
  • 時間真是好快啊,又到每日跟大家分享Python小技巧的時候了,今天跟大家分享的是爬取豆瓣top250電影。這篇文章我會把源碼 以及視頻教程給大家,想學的小伙伴可以動手操辦起來。話不多說,這就來。 ## 1.python程式 Python學習交流Q群:906715085### #導入庫 import ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • 前言 水果忍者到家都玩過吧,但是Python寫的水果忍者你肯定沒有玩過。今天就給你表演一個新的,用Python寫一個水果忍者。 水果忍者的玩法很簡單,儘可能的切開拋出的水果就行。 今天就用python簡單的模擬一下這個游戲。在這個簡單的項目中,我們用滑鼠選擇水果來切割,同時炸彈也會隱藏在水果 中,如 ...
  • 一、RedisInsight 簡介 RedisInsight 是一個直觀高效的 Redis GUI 管理工具,它可以對 Redis 的記憶體、連接數、命中率以及正常運行時間進行監控,並且可以在界面上使用 CLI 和連接的 Redis 進行交互(RedisInsight 內置對 Redis 模塊支持): ...
  • 前言 風玫瑰是由氣象學家用於給出如何風速和風向在特定位置通常分佈的簡明視圖的圖形工具。它也可以用來描述空氣質量污染源。 風玫瑰工具使用Matplotlib作為後端。 安裝方式直接使用pip install windrose 導入模塊 Python學習交流Q群:906715085#### import ...
  • 你好呀,我是歪歪。 我最近在 stackoverflow 上看到一段代碼,怎麼說呢。 就是初看一臉懵逼,看懂直接跪下! 我先帶你看看 stackoverflow 上的這個問題是啥,然後引出這段代碼: https://stackoverflow.com/questions/15182496/why-d ...
  • HashMap是大廠java語言的常考點,主要從底層結構,和線程安全等角度來進行考察,考察點比較集中,但是有一定難度 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...