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

来源: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
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...