OAuth2密碼模式已死,最先進的Spring Cloud認證授權方案在這裡

来源:https://www.cnblogs.com/felordcn/archive/2022/05/15/16273568.html
-Advertisement-
Play Games

舊的Spring Security OAuth2停止維護已經有一段時間了,99%的Spring Cloud微服務項目還在使用這些舊的體系,嚴重青黃不接。很多同學都在尋找新的解決方案,甚至還有念念不忘密碼模式的。胖哥也在前面寫了一篇解決思路的文章。好像還是不過癮,今天看到這篇文章的同學有福了,問題將在 ...


舊的Spring Security OAuth2停止維護已經有一段時間了,99%Spring Cloud微服務項目還在使用這些舊的體系,嚴重青黃不接。很多同學都在尋找新的解決方案,甚至還有念念不忘密碼模式的。胖哥也在前面寫了一篇解決思路的文章。好像還是不過癮,今天看到這篇文章的同學有福了,問題將在這裡得到解決。

方案

目前這應該是Spring生態中最新的解決方案,沒有之一。先看下流程,微服務無關的其它的組件這裡先屏蔽了,剩下圖的幾個組件:

詳細流程為

  • ①用戶向網關請求登錄或者通過網關請求資源伺服器的資源。

  • ②網關發現用戶沒有授權發起基於OAuth2授權碼的OIDC流程,向授權伺服器Id Server發起授權請求。

  • ③授權伺服器Id Server收到授權請求重定向到用戶登錄頁面要求用戶登錄認證,以發起授權。

  • ④用戶輸入用戶名密碼進行登錄認證。

  • Id Server授權伺服器處理用戶認證並重定向到網關約定的OAuth2 Redirect URI,這個過程屬於標準的OIDC授權碼流程。

  • ⑥網關獲得AccessTokenIdToken

    • 如果最初發起的是登錄就重定向到/
    • 如果最初發起的是請求資源伺服器資源就令牌中繼重定向到對應的資源。
  • 資源伺服器通過⑦⑧兩個鏈路響應用戶的請求。

請註意,上述流程中生成的AccessTokenIdToken不允許提供給用戶側,否則會引起中間人攻擊,預設提供的是一個cookie策略,大部分情況下這種策略是夠用的,如果你需要自定義必須深刻瞭解其機制,你可以通過我的Spring Security OAuth2專欄進行學習。

具體實現

根據上面的方案,我們需要三個應用,分別是網關Spring Cloud Gateway應用、資源伺服器應用Resource ServerOAuth2授權伺服器Id Server

Spring Cloud Gateway

Spring Cloud Gateway 應用,埠8080,它不僅僅是一個網關還是一個在授權伺服器Id Server註冊的OAuth2客戶端,通過Id Server你可以在一分鐘內完成配置。它需要配置到資源伺服器的路由規則和令牌中繼功能。核心配置為:

spring:
  application:
    name: gateway
  security:
    oauth2:
      client:
        registration:
          # 這裡為客戶端名稱可自行更改
          gatewayclient:
            client-id: e4da4a32-592b-46f0-ae1d-784310e88423
            # 密碼為註冊客戶端時的密碼
            client-secret: secret
            # 只能選擇一個
            redirect-uri: http://127.0.0.1:8080/login/oauth2/code/gatewayclient
            # 其它兩種方式為refresh_token,client_credentials
            authorization-grant-type: authorization_code
            client-authentication-method: client_secret_basic
            scope: message.write,userinfo,message.read,openid
        provider:
          gatewayclient:
            # 要保證授權伺服器地址可以被客戶端訪問
            issuer-uri: http://localhost:9000
  cloud:
    gateway:
      routes:
        - id: resource-server
          uri: http://127.0.0.1:8084
          predicates:
            - Path=/res/**
          filters:
            - TokenRelay

Resource Server

資源伺服器就是我們平常編寫的業務介面的伺服器,埠這裡定義為8084,它需要集成Spring Security及其Resource Server組件。它要負責定義資源介面的訪問許可權,例如:

         // 只有message.read才有資格訪問資源/res/foo
        httpSecurity.authorizeRequests()
                .antMatchers("/res/foo").hasAnyAuthority("SCOPE_message.read")
 

另外它還要和授權伺服器Id Server通訊獲取AccessToken的解碼公鑰:

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          jwk-set-uri: http://localhost:9000/oauth2/jwks

獲取解碼公鑰的原理在我的Spring Security OAuth2專欄有詳細介紹,這裡不再贅述。

Id Server

倉庫地址:https://github.com/NotFound403/id-server 歡迎star,歡迎貢獻。

Id Server是一個基於Spring Authorization Server的開源的授權伺服器,它大大降低OAuth2授權伺服器的學習使用難度,提供UI控制台,動態許可權控制,方便OAuth2客戶端管理,可一鍵生成Spring Security配置,開箱即用,少量配置修改就可部署,代碼開源,方便二次開發,支持OAuth2四種客戶端認證方式和三種授權模式。它是目前Spring安全生態中重要的組成部分,也是未來的技術發展趨勢,更多信息請參閱Id Server項目倉庫的介紹

Id Server在本文扮演的是OAuth2授權伺服器的角色,負責對授權請求進行處理,維護客戶端註冊信息,授權用戶信息,後續會加入IDP支持,各種三方登錄的用戶也可以動態在這裡進行登錄,就像這樣:

聯合登錄

根據業務需要第三方OAuth2授權登錄也能優雅的接入,當然,接入的登錄方式需要OIDC或者OAuth2的支持。

DEMO以及使用方法

上述完整DEMOId Server的倉庫中的samples下。使用方法:

  • 拉取Id Server項目並載入依賴。
  • IntelliJ IDEA中依次單獨對samples文件夾下的所有項目的pom.xml進行右鍵菜單選中Add As Maven Project,這一步很重要。
  • 依次啟動Id Servergatewayresource-server三個項目。

測試登錄

  • 瀏覽器訪問http://127.0.0.1:8080/login,點擊http://localhost:9000
  • 輸入用戶名密碼user/user
  • 能查看到認證信息就證明成功了,再次重申,在生產中該信息十分敏感,不應該直接對前端暴露。
  • 瀏覽器訪問http://127.0.0.1:8080/res/foo,可以訪問到資源伺服器的資源。

另一種測試

關閉瀏覽器重新打開,瀏覽器訪問http://127.0.0.1:8080/res/foo,你看看會發生什麼?

總結

通過OAuth2客戶端、Spring Cloud GatewayOAuth2授權伺服器、OAuth2資源伺服器的聯動,你會發現授權碼模式也可以實現完整的微服務認證授權,而且比密碼模式更加安全。後續Id Server實現了聯合登錄之後,其它第三方登錄也可以無縫集成進來。多多關註,更多先進的黑科技等著你。

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

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

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

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

-Advertisement-
Play Games
更多相關文章
  • Vue-mini 完整的Demo示例:[email protected]:xsk-walter/Vue-mini.git 一、Vue實例 構造函數: $option\ $el\ $data 判斷是否存在 通過 || 邏輯運算符; _ProxyData 遍歷所有data屬性,並註入到vue實例中; 判斷是否 ...
  • 數組對象 創建數組 創建方式1: var arrname = [元素0,元素1,….]; // var arr=[1,2,3]; 創建方式2: var arrname = new Array(元素0,元素1,….); // var test=new Array(100,"a",true); 數組方法 ...
  • Eclipse WindowBuilder(SWT)插件安裝及初次使用(萌新) 一、插件安裝 (有VPN的掛VPN,伺服器在外網更新下載比較慢) 1.首先更新到最新版本 點擊Help,點擊check for update,右下角顯示查詢進度,查詢完畢會顯示最新版內容。全部更新 2.還是在help內, ...
  • 時間真的好快呀!一晃眼五一假期就結束了,假期大家都玩的開心不?今天我要給大家分享幾個練手 的基礎案例,保證大家都沒有玩過。話不多說,來來來… 一、超市購買薯片 python學習交流Q群:906715085##### # 用戶輸入薯片的單價 danjia = float(input("薯片的單價")) ...
  • 這節課是巡安似海PyHacker編寫指南的《Sql註入腳本編寫》有些註入點sqlmap跑不出,例如延時註入,實際延時與語句延時時間不符,sqlmap就跑不出,這就需要我們自己根據實際情況編寫腳本來註入了。文末,涉及了sqlmap tamper編寫,所以需要一定的python基礎才能看懂。喜歡用Pyt... ...
  • 通過URL的尾碼發現了Spring中的useSuffixPatternMatch這個參數 ...
  • 本文大部分來自官方教程的Google翻譯 但是加了一點點個人的理解和其他相關知識 轉載請註明 原文鏈接 :https://www.cnblogs.com/Multya/p/16273753.html 官方教程: https://www.sfml-dev.org/tutorials/2.5/ 持續更新 ...
  • 插件允許對Mybatis的四大對象(Executor、ParameterHandler、ResultSetHandler、StatementHandler)進行攔截 問題 Mybatis插件的註冊順序與調用順序的關係? 使用 在講源碼之前,先看看如何自定義插件。 mybatis-demo,官方文檔 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...