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

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

認證 & 授權

  • ??認證(Authentication):確認用戶身份

  • ??授權(Authorization):授予用戶訪問資源的權限

關于認證和授權的基礎內容,可回顧:2.3 探索橫切關注點 - 使用授權和權限系統?。

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

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

訪問令牌

訪問令牌內容如下:

b4f7708a2bc12f4d3201fa725fbd5d4d.png
access_token_content

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

標準聲明(claims)

  • ??Sub: 用戶Id

  • ??Role: 用戶角色

  • ??Scope: 允許的范圍

存儲訪問令牌

對于WEB應用程序,存儲在瀏覽器本地存儲(Local Storage),鍵為?access_tokenid_token?。

44b39041cdd59f2a1238a6027d34aa77.png
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),進行權限控制。

f8730782f793ea88fde3f4b882c295bb.png
external_authorization_service

如何獲取應用數據?

  • ??直接從服務數據庫中讀取?

  • ??在授權服務調用發送數據?

  • ??將數據預復制到授權服務的數據庫中?

其他問題:

  • ??授權服務調用上的網絡延遲。

  • ??授權服務成為瓶頸。

討論2:在API網關檢查

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

6032dbaa1fbfdf262e632fe5479e1559.png
check_api_gateway

優點

  • ??將授權邏輯與微服務解耦

  • ??防止未經授權的請求調用微服務

缺點

  • ??需要在API中自定義處理邏輯,受限于網關實現選擇的技術

  • ??需要將權限映射到HTTP,如:URL, HTTP 方法和 HTTP頭。

討論3:授權類庫

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

d34178517e8a0b4b739a7fbd4dd62b49.png
authorization_library

優點

  • ??將授權邏輯與微服務邏輯解耦

  • ??應用程序數據可用

  • ??可以自定義授權邏輯

缺點

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

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

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

方式一:每個微服務在自己的數據庫中都有自己的權限表?

  • ??難以管理(加載和保存)權限

  • ??很難得到所有的權限

  • ??服務的責任太大

方式二:一個中央權限數據庫?

  • ??所有服務都通過授權庫直接連接到該數據庫。

綜合以上兩種方式,采用中央權限數據庫,實現策略信息點。

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

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

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

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

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

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

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

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

ABP 解決方案

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

權限管理

定義權限

ac3d6b31117b77ecaf680e8eda7a80bc.png
define_permissions

檢測權限

5f3650d64d3f183a68664ad1dce48fe8.png
check_permissions

授予權限

13c26ef6fd0848fe973ae219ab0ef5c3.png
grant_permissions

定義權限

c8d997ac8a5c53d225c0e1924c57ee45.png
apb_permission_define

定義權限相關參數:

  • ??權限名稱

  • ??顯示本地化權限名稱

  • ??其他依賴:功能,全局功能

  • ??自定義數據

微服務中的權限管理

權限管理UI

e0229ff2dd0a2e464984bfc0477f7440.png
permission_manage_ui

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

097e354d827ff972bdde6fd7af1adaa9.png
abp_permission_microservice

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

基于資源的授權

ABP 采用基于資源的授權策略

3a17a956ced42f48811b11220d03b892.png
resource_base_permission

權限過濾

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

dca183f7ba5ca522a5dfe992eacd88a7.png
aggregateroot_question

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

  • ??OrganizationId?組織Id,允許組織

  • ??CategoryId?類別Id,允許類別

  • ??AssignedUserId?分配用戶Id,允許分配用戶可見

  • ??CreatorUserId?創建用戶Id,允許創建用戶可見

  • ??IsResolved?是否解決,在UI過濾

更新權限定義

關于服務啟動

  • ??計算所有權限定義的哈希值

  • ??與分布式緩存中的哈希值進行比較

  • ??序列化和保存權限定義(僅更改/新增)

  • ??更新權限戳以通知其他服務

  • ??使用微服務名稱作為緩存鍵前綴

2f58fa820e8f99b1c7818b4d2fae4a45.png
update_permission_define

獲取權限定義

獲取邏輯

  • ??如果是最新的,檢查權限緩存戳并使用內存中的緩存。頻率控制(30秒)。

  • ??如果不同,獲取并反序列化權限定義。

在服務器啟動時,預緩存權限定義。

4ae7f25b83ea8780f4da8b24707d4699.png
abp_get_permission_define

用戶界面:檢測所有權限

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

968984ee626e1569ad81470c463791f3.png
check_all_permission

管理:管理所有權限

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

787c16eb1df11dfb67bb2aeaa1e6d09d.png
manage_all_permission

結論

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

  • ??設計注意事項:策略實施點、策略決策點、策略信息點和策略管理點。

  • ??集中存儲權限數據。

  • ??集中管理,采用開關風格權限。

  • ??總是要求微服務自定義和基于資源的權限。

  • ??依賴數據庫查詢進行基于權限的過濾。

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

a54bc6a1ecd0af1b71cea2b058bc53bc.png

精讀 Mastering ABP Framework

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280951.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280951.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280951.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pat 團體天梯賽 L2-012. 關于堆的判斷

L2-012. 關于堆的判斷 時間限制400 ms內存限制65536 kB代碼長度限制8000 B判題程序Standard作者陳越將一系列給定數字順序插入一個初始為空的小頂堆H[]。隨后判斷一系列相關命題是否為真。命題分下列幾種: “x is the root”:x是根結點;“x a…

04-1.jQuery事件與補充each/data

目錄 事件 事件綁定 常用事件 阻止后續事件執行 補充 each .data() 事件 事件綁定 .on( events [, selector ],function(){}) events: 事件selector: 選擇器(可選的)function: 事件處理函數 普通綁定,沒有選擇器&#x…

【刷出存在感】鋒會圓桌現場

【編者按】本文為鋒會|路由器專場的圓桌全文(有刪減)。 圓桌嘉賓:(自左向右依次) 極路由聯合創始人 丁衣 知道創宇研究部總監(安全專家) 余弦 WRTnode創始人(開源硬件領域&#xff0…

如何從命令行瀏覽和連接到無線網絡

() We are always on the lookout for geeky ways to impress our friends, and recently we came across a way to connect to our wireless network from the command prompt, so today we’ll show you how to do it as well. 我們一直在尋找令人印象深刻的方式來打動我們的…

html 基礎之canvas 和 localStorage

1&#xff0c;建立一個canvas 畫布&#xff1a; 1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <meta name"viewport" content"widthdevice-width, initial-scale1.0">…

國產數據助力金融行業維護信息安全

金融信息系統作為國家關鍵信息基礎設施&#xff0c;直接關系到國家經濟、社會的正常運行。長期以來&#xff0c;我國金融信息化依賴進口設備和系統&#xff0c;金融行業尤其是銀行業被IBM、HP、甲骨文等外商捆綁較深&#xff0c;金融行業信息化設備的軟硬件系統被外商壟斷。這等…

mysql查詢優化以及面試小結

mysql面試小結&#xff1a; 1.mysql的基本架構 2.mysql的索引 btree的原理 3.mysql的索引優化 4.mysql的sql查詢優化 慢查詢日志 Show prodile 全局查詢日志 5.mysql的主從復制 6.mysql的鎖機制 表鎖 行鎖轉載于:https://www.cnblogs.com/daiwei1981/p/10224934.html

05.Bootstrap導入基礎筆記

Bootstrap介紹 Bootstrap是Twitter開源的基于HTML、CSS、JavaScript的前端框架。 它是為實現快速開發Web應用程序而設計的一套前端工具包。 它支持響應式布局&#xff0c;并且在V3版本之后堅持移動設備優先。 為什么要使用Bootstrap&#xff1f; 在Bootstrap出現之前&…

etcd v3 集群——簡單配置

2019獨角獸企業重金招聘Python工程師標準>>> 一、etcd v3安裝&#xff1a; tar -axf etcd-v3.2.0-linux-amd64.tar.gz -C /usr/local/src/chmod ax /usr/local/src/etcd-v3.2.0-linux-amd64/etcd*cp -a /usr/local/src/etcd-v3.2.0-linux-amd64/etcd* /usr/local/bi…

windows變量延遲_Windows 10的2018年10月更新可能推遲到11月(這就是原因)

windows變量延遲Microsoft stopped offering Windows 10’s October 2018 Update on October 6, as it was deleting some people’s files. Now, another ugly data loss bug has reared its head, and it won’t be fixed until November. 微軟于10月6日停止提供Windows 10的…

rest-framework-權限組件

rest-framework-權限組件 一 權限簡介 只用超級用戶才能訪問指定的數據&#xff0c;普通用戶不能訪問&#xff0c;所以就要有權限組件對其限制 二 局部使用 from rest_framework.permissions import BasePermission class UserPermission(BasePermission):message 不是超級用戶…

linux服務器上如何顯示工作路徑

1. 修改PS環境變量 [rootlinux-node01 ~]# vi /etc/bashrc [ "$PS1" "\\s-\\v\\\$ " ] && PS1"[\u\h \W]\\$ "將PS1"[\u\h \W]\\$ "修改成PS1"[\u\h \w]\\$ " 2. 重新打開一個窗口 [rootlinux-node01 ~]# cd /etc…

MySQL-01:下載安裝配置及初始化命令

目錄 1、下載 2、解壓 3、初始化 4、啟動MySQL服務 5、連接MySQL服務 6、快捷設置 a. 添加環境變量 b. 將MySQL服務制作成windows服務 1、下載 下載壓縮包&#xff0c;非安裝包 下載網址&#xff1a; http://dev.mysql.com/downloads/mysql/ 2、解壓 選擇解壓目錄&…

根據MediatR的Contract Messages自動生成Minimal WebApi接口

大家好&#xff0c;我是失業在家&#xff0c;正在找工作的博主Jerry。今天給大家介紹一個能大大減少ASP.Net Minimal WebApi編碼量的方法。我們一般會把微服務的VO和DTO封裝成消息類&#xff0c;并作為WebApi的Request和Response參數進行網絡傳遞。如果使用MediatR&#xff0c;…

bupt summer training for 16 #8 ——字符串處理

https://vjudge.net/contest/175596#overview A.設第i次出現的位置左右端點分別為Li&#xff0c;Ri 初始化L0 0&#xff0c;則有ans sum{ (L[i] - L[i-1]) * (n 1 - Ri) } 1 #include <cstdio>2 #include <cstring>3 #include <iostream>4 #include <a…

程序員必須知道的HTML常用代碼有哪些?

HTML即超文本標記語言&#xff0c;是目前應用最為廣泛的語言之一&#xff0c;是組成一個網頁的主要語言。在現今這個HTML5華麗麗地占領了整個互聯網的時候&#xff0c;如果想要通過網頁抓住瀏覽者的眼球光靠因循守舊是不行的&#xff0c;程序猿們需要掌握一些必須知道的HTML常用…

公用ip地址查詢_是什么使您無法更改公用IP地址并在Internet上造成嚴重破壞?

公用ip地址查詢What exactly is preventing you (or anyone else) from changing their IP address and causing all sorts of headaches for ISPs and other Internet users? 到底是什么在阻止您(或其他任何人)更改其IP地址并導致ISP和其他Internet用戶感到頭疼&#xff1f; …

Vim的新一代補全插件:coc.nvim

coc.nvim可以同時在nvim和vim8.1上使用。 安裝 參考官方&#xff1a;Install coc.nvim 推薦使用vim-plug插件管理器&#xff0c;在vimrc中添加&#xff1a; Plug neoclide/coc.nvim, {do: { -> coc#util#install()}} 然后輸入命令:PlugInstall 等待插件下載&#xff0c;再等…

MySQL-02:“數據庫”操作基本命令及權限筆記

目錄 數據庫操作 1、顯示數據庫 2、創建數據庫 3、使用數據庫 4、用戶管理 5、授權管理 數據庫操作 1、顯示數據庫 SHOW DATABASES; 默認數據庫&#xff1a;   mysql - 用戶權限相關數據   test - 用于用戶測試數據   information_schema - MySQL本身架構相關數據…

C++STL——概述

一、相關介紹 STL 標準模板庫在編寫代碼的過程中有一些程序經常會被用到&#xff0c;而且需求特別穩定&#xff0c;所以C中把這些常用的模板做了統一的規范&#xff0c;慢慢的就形成了STL提供三種類型的組件: 容器、迭代器和算法&#xff0c;它們都支持泛型程序設計標準容器 順…