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

来源: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
  • 簡介 本文的初衷是希望幫助那些有其它平臺視覺演算法開發經驗的人能快速轉入Halcon平臺下,通過文中的示例開發者能快速瞭解一個Halcon項目開發的基本步驟,讓開發者能把精力完全集中到演算法的開發上面。 首先,你需要安裝Halcon,HALCON 18.11.0.1的安裝包會放在文章末尾。安裝包分開發和 ...
  • 本文是對Datawhale的動手學數據分析課程的學習總結,記錄了整體的學習過程、答案以及個人感想,代碼較為詳細。 ...
  • JZ7重建二叉樹 描述 給定節點數為 n 的二叉樹的前序遍歷和中序遍歷結果,請重建出該二叉樹並返回它的頭結點。 例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6} 提示: 1.vin.length == pre.length 2.pre 和 vin ...
  • 我們都知道在Java編程中多線程的同步使用synchronized關鍵字來標識,那麼這個關鍵字在JVM底層到底是如何實現的呢。 我們先來思考一下如果我們自己實現的一個鎖該怎麼做呢: 首先肯定要有個標記記錄對象是否已經上鎖,執行同步代碼之前判斷這個標誌,如果對象已經上鎖線程就阻塞等待鎖的釋放。 其次要 ...
  • 目錄 一.OpenGL 色階 1.Windows OpenGL ES 版本 2.Windows OpenGL 版本 二.OpenGL 色階 GLSL Shader 三.猜你喜歡 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 基礎 零基礎 Ope ...
  • 1. 查看Linux伺服器版本信息 # cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) 2. 禪道開源版安裝包下載 wget http://dl.cnezsoft.com/zentao/9.8.2/ZenTaoPMS.9.8. ...
  • Spring 框架可以為 Java 應用程式開發提供全面的基礎設施支持,它是現在非常流行的 Java 開源框架,對於一個 Java 開發人員來說,熟練掌握 Spring 是必不可少的。 ...
  • 前言 本篇是c++總結的第二篇,關於c++的對象模型,在構造、拷貝虛函數上重點分析,也包含了c++11class的新用法和特性,如有不當,還請指教! c++三大特性 訪問許可權 ​ 在c++中通過public、protected、private三個關鍵字來控製成員變數和成員函數的訪問許可權,它們分別表示 ...
  • 一.小結 1.使用二維數組來存儲表格 2.可以使用以下語法來聲明二維數組變數: 元素類型[ ] [ ]數組變數 3.可以使用以下語法來創建二維數組變數: new 元素類型 [行的個數][列的個數] 4.使用下麵的語法表示二維數組中的每個元素: 數組變數[行下標][列的個數] 5.可使用數組初始化語法 ...
  • typimg是一款為typora編輯器提供圖像自定義上傳服務的工具,該工具將在typora中輸入的網路圖片、本地圖片、剪貼板圖片/截圖上傳到博客園,支持在MacOS、Windiws、Linux三個平臺上運行。 ...