微服務和分散式系統中的授權解決方案

来源:https://www.cnblogs.com/YGYH/archive/2022/11/24/16920021.html
-Advertisement-
Play Games

本文是 《精讀 Mastering ABP Framework》 2.3 探索橫切關註點 - 使用授權和許可權系統 一節的擴充內容,重點探討了授權在分散式和微服務系統中遇到的挑戰,以及 ABP Framework 中採用的解決方案。 ...


本文是 《精讀 Mastering ABP Framework》 2.3 探索橫切關註點 - 使用授權和許可權系統 一節的擴充內容,重點探討了授權在分散式和微服務系統中遇到的挑戰,以及 ABP Framework 中採用的解決方案。

認證 & 授權

  • 認證(Authentication):確認用戶身份
  • 授權(Authorization):授予用戶訪問資源的許可權

關於認證和授權的基礎內容,可參考:第7章 探索橫切關註點 - 使用授權和許可權系統

在微服務和分散式系統,對於許可權,我們需要考慮的更多,比如:如何在一個微服務中設置許可權,而在另一個微服務中檢測許可權,以及許可權如何集中管理。

分散式系統中,認證和授權信息通常以 令牌(Token) 方式描述,所以先瞭解令牌內容的格式以及令牌如何存儲

訪問令牌

訪問令牌內容如下:

access_token_content

訪問令牌內容由多個聲明(Claim)組成,包含標準聲明自定義聲明

標準聲明(claims)

  • Sub: 用戶Id
  • Role: 用戶角色
  • Scope: 允許的範圍

存儲訪問令牌

對於WEB應用程式,存儲在瀏覽器本地存儲(Local Storage),鍵為 access_token id_token

token_store

對於其他類型的應用程式,同樣可以在獲取到訪問令牌之後,在本地存儲。

授權類型 & 需求

  • 基於聲明的策略
  • 開/關風格許可權(通常是基於用戶角色
    • 開關數據保存在許可權資料庫
  • 自定義策略
    • 檢查許可權資料庫並直接應用自定義邏輯
  • 基於資源的策略
    • 檢查許可權資料庫並根據請求的資源應用自定義邏輯

基於資源的策略

基於資源的策略,用一句話來描述就是:用戶客戶端(C)是否可以在資源(R)上執行操作(A) ?

舉個例子:許可權控制:當前用戶是否可以編輯產品信息?

我們使用基於資源的策略,來實現以上許可權控制:操作(A)對應編輯資源(R)對應產品信息用戶(C)對應當前用戶

關於編輯可能存在的授權邏輯:

  • 如果產品被鎖定,不允許
  • 如果產品是由當前用戶創建的,則允許
  • 如果用戶有編輯產品的許可權,則允許,該許可權由管理員管理用戶
  • 如果用戶所屬的角色有編輯許可權,則允許
  • 只有當用戶在產品所屬的部門中工作時,才允許

基於資源的策略,可以很好地處理以上授權邏輯。

需求:授權組件

設計一個良好的授權系統,我們通常需要考慮的四個點:

  • 策略實施點
  • 策略決策點
  • 策略信息點
  • 策略管理點

策略實施點(PEP: Policy Enforcement Point),即在哪裡實施授權? 在API網關中?還是在當前服務中?

策略決策點(PDP: Policy Decision Point)即在哪裡執行授權邏輯?。在當前的過程中?還是在專門的服務中?

策略信息點(PIP: Policy Information Point)即 從哪裡以及如何獲取執行授權邏輯的數據? 直接訪問資料庫?還是按需收集?

策略管理點(PAP: Policy Administration Point)即直接訪問資料庫?按需收集? 通常系統中提供統一的管理界面。

架構討論

基於前面授權組件的四個點,我們需要做一些討論,以及清楚其實現方式的利弊。

討論1:外部授權服務

策略實施點(PEP)發生在微服務中,在微服務中調用授權服務(PDP),進行許可權控制。

external_authorization_service

如何獲取應用數據?

  • 直接從服務資料庫中讀取?
  • 在授權服務調用發送數據?
  • 將數據預複製到授權服務的資料庫中?

其他問題:

  • 授權服務調用上的網路延遲。
  • 授權服務成為瓶頸。

討論2:在API網關檢查

策略實施點(PEP)發生在網關中,在網關中調用授權服務(PDP),進行許可權控制。

check_api_gateway

優點

  • 將授權邏輯與微服務解耦
  • 防止未經授權的請求調用微服務

缺點

  • 需要在API中自定義處理邏輯,受限於網關實現選擇的技術
  • 需要將許可權映射到HTTP,如:URL, HTTP 方法和 HTTP頭。

討論3:授權類庫

將策略實施點、策略決策點、策略信息點的操作封裝為通用的類庫,在微服務中調用管理許可權。

authorization_library

優點

  • 將授權邏輯與微服務邏輯解耦
  • 應用程式數據可用
  • 可以自定義授權邏輯

缺點

  • 如果使用不同技術開發的微服務,如:.NET 、Python、Java,則存在問題,不能跨開發語言。

綜合以上三種方案的優缺點,採用授權類庫的方式

討論4:如何保存許可權數據?

方式一:每個微服務在自己的資料庫中都有自己的許可權表?

  • 難以管理(載入和保存)許可權
  • 很難得到所有的許可權
  • 服務的責任太大

方式二:一個中央許可權資料庫?

  • 所有服務都通過授權庫直接連接到該資料庫。

綜合以上兩種方式,採用中央許可權資料庫,實現策略信息點。

討論5:如何檢查和管理所有許可權?

方式一:詢問所有微服務的許可權需求?

問題:服務發現、性能、服務上的負載太多,難以管理許可權。

方式二:計算微服務中的所有許可權併在中心位置預緩存?

管理和刷新緩存非常困難,任意的數據更改可能會影響許多用戶的許可權,緩存會太大。

方式三:在許可權管理服務的中心位置計算許可權?

非常適合開/關風格的許可權,對微服務內部的依賴最小。

綜合以上三種方式,採用在許可權管理服務的中心位置計算許可權,實現策略管理點(PAP)。

ABP 解決方案

基於以上的架構分析,我們來看一看在 ABP Framework 中的具體實現。

許可權管理

定義許可權

define_permissions

檢測許可權

check_permissions

授予許可權

grant_permissions

定義許可權

apb_permission_define

定義許可權相關參數:

  • 許可權名稱
  • 顯示本地化許可權名稱
  • 其他依賴:功能,全局功能
  • 自定義數據

微服務中的許可權管理

許可權管理UI

permission_manage_ui

管理UI數據來自,許可權管理微服務;其他微服務中許可權數據(許可權定義、許可權組、授權信息)保存到許可權管理資料庫中。

abp_permission_microservice

在許可權管理微服務中和其他微服務一樣使用 ABP 授權類庫。

基於資源的授權

ABP 採用基於資源的授權策略

resource_base_permission

許可權過濾

需要獲取 資源(實體) 列表,根據業務規則用戶預設許可權進行篩選。

aggregateroot_question

上圖代碼中,根據實體中的信息實施相應的業務規則,設置許可權:

  • OrganizationId 組織Id,允許組織
  • CategoryId 類別Id,允許類別
  • AssignedUserId 分配用戶Id,允許分配用戶可見
  • CreatorUserId 創建用戶Id,允許創建用戶可見
  • IsResolved 是否解決,在UI過濾

更新許可權定義

關於服務啟動

  • 計算所有許可權定義的哈希值
  • 與分散式緩存中的哈希值進行比較
  • 序列化和保存許可權定義(僅更改/新增)
  • 更新許可權戳以通知其他服務
  • 使用微服務名稱作為緩存鍵首碼

update_permission_define

獲取許可權定義

獲取邏輯

  • 如果是最新的,檢查許可權緩存戳並使用記憶體中的緩存。頻率控制(30秒)。
  • 如果不同,獲取並反序列化許可權定義。

在伺服器啟動時,預緩存許可權定義。

abp_get_permission_define

用戶界面:檢測所有許可權

獲取當前用戶所有授予許可權的列表!我們為什麼需要它?用於控制顯示或隱藏菜單項;用於控制顯示或隱藏UI中的部分內容,如:按鈕,標題,工具欄等;用於檢查SPA的客戶端許可權。

check_all_permission

管理:管理所有許可權

將管理一個角色或用戶的所有許可權在同一個地方顯示。

manage_all_permission

結論

微服務和分散式系統中的授權系統設計:

  • 設計註意事項:策略實施點、策略決策點、策略信息點和策略管理點。
  • 集中存儲許可權數據。
  • 集中管理,採用開關風格許可權。
  • 總是要求微服務自定義和基於資源的許可權。
  • 依賴資料庫查詢進行基於許可權的過濾。

本文已收錄到《精讀 Mastering ABP Framework》 第六部分:擴展

精讀 Mastering ABP Framework

記錄技術修行中的反思與感悟,以碼傳心,以軟制道,知行合一!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 主要推到了極化碼編碼矩陣生成迭代方式,並針對遞歸方法和按位生成(硬體生成不適用遞歸方案)的方法用matlab實現。 通道組合 W表示原始B-DMC通道。 下圖是兩個通道組合的例子。 長度為2的通道組合模型 長度為4的通道組合模型 長度為N/2與N的通道組合形式 G的推導及性質 G公式推導 編碼矩陣生 ...
  • 對於緩存容器而言,容量限制與數據淘汰是兩個基礎且核心的關鍵點,也是實際使用的時候使用頻率最高的特性。本篇在上一文基礎上深入解讀下Guava Cache中的容量限制與數據淘汰策略的實現與使用約束。 ...
  • Spring,作為 Java EE 的事實規範,在2022年11月16日發佈了最新的 6.0.0 GA 版本。這個版本是框架後續新生代的初始版本,擁抱持續創新的 OpenJDK 和 Java 生態。新的版本以 Java 17+ 作為 baseline,並遷移至 Jakarta EE 9+(即,使用 ...
  • 作者:寧海翔 1 前言 對象拷貝,是我們在開發過程中,繞不開的過程,既存在於Po、Dto、Do、Vo各個表現層數據的轉換,也存在於系統交互如序列化、反序列化。 Java對象拷貝分為深拷貝和淺拷貝,目前常用的屬性拷貝工具,包括Apache的BeanUtils、Spring的BeanUtils、Cgli ...
  • 用python爬蟲技術,爬取百度搜索結果數據,包含欄位: 頁碼、標題、百度鏈接、真實鏈接、簡介、網站名稱。 並把源碼封裝成exe文件,方便沒有python環境,或者不懂技術的人使用它。 ...
  • 上篇隨筆發佈後,一天內,十幾個爬蟲網站爬取了我的隨筆,有些網站非但沒有註明來源,反而將自己標為博文的原創者,並更改了圖像水印,這篇被爬的隨筆雖瀏覽量不大,但好歹是自己一字一字認真碼出來的,被偷實在令人心情不爽,在本篇隨筆記錄一下。 ...
  • WebDAV 是超文本傳輸協議 (HTTP) 的一組擴展,為 Internet 上電腦之間的編輯和文件管理提供了標準.利用這個協議用戶可以通過Web進行遠程的基本文件操作,如拷貝、移動、刪除等。 在IIS 7.0中,WebDAV是作為獨立擴展模塊,需要單獨進行下載,而IIS 7.5以及以上版本中... ...
  • .NET 現在支持跨平臺這件事情已經是眾所周知的特點了,雖然平臺整體支持跨平臺了,但是我們的代碼如果真的想要實現跨平臺運行其實還是有些小細節要註意的,今天想要記錄分享的就是關於 文件I/O操作時路徑的拼接問題。 在 Windows 環境下我們常見的路徑格式如下: D:\Software\AppDat ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...