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

来源: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
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...