摘要:認為權限授權實際上是的問題。具體的權限,正向授權與負向授權。應用建模業務場景權限管理鑒權設計應用建模系統架構上支撐權限系統靈活配置,不僵硬字段,不僵硬行為,基于各種業務權限管控的特征靈活設計。表示許可權與角色之間多對多的指派關系。
序
之前寫過一篇大話權限中心的PHP架構之道,主要是從軟件工程角度介紹,如何通過編碼規范、依賴管理、數據源架構、事務處理、單元測試等技術,來保障權限系統的高可用,并未真正的涉及這套系統的架構。
今天準備從設計細節上分享一二。
望各位看官,心有“空杯”,帶著“問題”一探究竟。
0. RBAC3這里還是尤為的重要,因為他是整套系統設計的根基。
所以殘忍的從上一篇中復制了一遍。。。
RBAC認為權限授權實際上是Who、What、How的問題。在RBAC模型中,who、what、how構成了訪問權限三元組,也就是“Who對What(Which)進行How的操作”。
Who:權限的擁用者或主體(如Principal、User、Group、Role、Actor等等)
What:權限針對的對象或資源(Resource、Class)。
How:具體的權限(Privilege,正向授權與負向授權)。
Operator:操作。表明對What的How操作。也就是Privilege+Resource
Role:角色,一定數量的權限的集合。權限分配的單位與載體,目的是隔離User與Privilege的邏輯關系.
權限系統的本質就是這個模型(個人觀點勿噴)。我們在此核心思想上,抽象了兩個新概念。
應用建模、權限自治
下面將從以下4個層面展開介紹。
應用建模
業務場景
權限管理
鑒權設計
1. 應用建模系統架構上支撐權限系統靈活配置,不僵硬字段,不僵硬行為,基于各種業務權限管控的特征靈活設計。
公式一枚:應用=資源+行為+角色
1.1 字段定義簡單點說,就是要管控資源的屬性和行為。
比如要管控菜單,屬性就包括菜單ID、菜單名稱、菜單URL、菜單ICON、上級菜單ID等,行為就包括訪問、授權等。(菜單權限)
比如要管控城市,屬性就包括區域ID、區域名稱、區域代碼、所屬區域ID等,行為就包括訪問、授權等。(區域權限)
比如要管控CMS,字段就包含頁面ID、頁面名稱等,行為就包括訪問、授權、編輯、重置等。(CMS數據權限)
按照慣性的思維,這里就是3張資源表對應角色表,同時還有3張資源角色關系表,換而言之,就是有多少資源需要管控就有多少張表(又是個人觀點,勿噴)。
慣性的思維,兩個痛點。
每一種資源都要獨立存儲。
每一種資源都要有一套Form排版&交互&存儲實現。
為了解決這個問題,我們做了以下的設計。
字段建模任意資源的字段,都可以抽象成如下幾類。
資源映射字段(mapField)
資源節點字段(treeFiled)
資源系統字段(systemFields)
資源表單字段(columns)
資源行為字段(privileges)
舉個栗子:菜單資源。
class menu extends app { public static $appMapField = "url"; public static $appTreeField = "name"; public static $columns = array( array( "id" => "id", "label" => "菜單ID", "type" => "input", "format" => "int", "option" => array() ), array( "id" => "name", "label" => "菜單名稱", "type" => "input", "format" => "string", "option" => array() ) ); public static $privileges = array( array( "id" => "access", "name" => "訪問" ) ); public static $systemFields = array("id", "parent_id"); }動態表單
表單在網頁中主要負責數據采集功能。一個表單有三個基本組成部分:
表單標簽;
表單域,包含了文本框、密碼框、隱藏域、多行文本框、復選框、單選框、下拉選擇框和文件上傳框等;
表單按鈕。
常規工作是靜態表單。
設計動態表單模型,基本的思路應該是數據和表現顯示的分離。拋開表現層,一個表單包含的若干個字段和填寫的數據。所謂動態,就是這些字段名稱可能改變,數量可能有增減。
通過資源的columns字段控制表現層。
通過資源的數據字段控制數據層。
通過這種模式,任意資源的Form排版&交互&存儲都動態實現了。
1.2 數據存儲資源表對應的Schema如下:
字段名稱 | 字段備注 |
---|---|
應用ID | / |
資源ID | / |
資源父ID | / |
資源Data | JSON |
通過反射API,獲取當前應用的資源存儲插件(資源Data字段)。
app::find($params["app_id"])->getResoucePlugin()->save($params["data"]);
通過資源基類做數據存儲的統一封裝。
public function save() { $this->beforeSave($this->attributes); } protected function beforeSave() { //check attributes }
很顯然資源Data字段,不能很好的完成單資源行為鑒權的任務。
設計上引入了資源映射字段,每當資源變更時,觸發addMap,會同步字段信息到資源映射關系表中(資源的語義化索引)。
舉幾個栗子,方便大家理解這個字段:
比如菜單類應用,映射字段就是菜單鏈接。
比如數據類應用,映射字段就是數據ID。
public function addMap() { if ($this->map) { //sync map field } else { //create map field } }
應用建模,相對來說是一個較技術的話題,換個方向,下面來和大家聊一聊系統的業務場景。
2. 業務場景系統架構上支撐多種業務形態的權限管控。
2.1 菜單類業務說到權限,大多數應用場景都會想到菜單權限,然而我們也不例外,菜單類的應用,就是生產的第一個實例。
舉個栗子:A系統/菜單權限應用
字段
菜單ID、菜單名稱、菜單鏈接、菜單上級ID
行為
訪問、授權
2.2 數據類業務數據類應用,相對于菜單類型來說,更關注的是,對某一行數據的行為控制,行為是多樣的。
舉個栗子:A數據/數據權限應用
字段
數據ID、數據名稱
行為
訪問、授權、編輯、刪除、新增、重置、導出、導入
2.3 表單類業務表單類應用,在2B的系統中,權限設計尤為重要。
舉個栗子:A確認單/表單權限應用
字段
模塊ID、模塊名稱(行程模塊、供應商模塊、訂單模塊、財務模塊)
行為
訪問、授權、只讀、可寫、隱藏
總結一下權限的業務場景:
菜單類:單資源的單行為(能否”行為“當前“資源”)
數據類:單資源的多行為
表單類:多資源的多行為
3 權限管理小伙伴們,你們的業務場景能實現嗎?(留言吧)
接下來說說權限管理中的一些設計之道。
3.1 自治設計上參考JIRA,當前應用的管理者主導當前應用的權限生態。
資源的增刪改查
角色的增刪改查
資源字段定義
資源行為定義
資源行為的角色賦予
3.2 自舉系統中給每一種資源都天生賦予一種系統行為叫做“授權”。
任意資源節點的角色行為賦予,都由擁有該資源節點授權行為的角色去分配。
3.3 雙向授權兩個維度授權,方便檢索,也方便配置。
基于角色+行為,選擇資源。
基于資源+行為,選擇角色。
^^^^^^^^
下一個階段將會支持默認權限的配置,非應用內的角色,也同樣可以享有應用內的部分資源的部分行為的權限。
4 鑒權設計最后簡單說下,鑒權接口的設計。
U、R、P、S分別表示用戶集合、角色集合、許可權集合和會話集合。
PA P×R表示許可權與角色之間多對多的指派關系。
UA U×R表示用戶與角色之間多對多的指派關系。
公式一枚:S=UA ∩ PA
4.1 單應用+單行為統稱為資源樹接口。
舉個栗子:R角色在A應用中擁有P行為的資源。
4.2 單應用+單資源+單行為統稱為行為鑒權接口。
舉個栗子:R角色在A應用中是否擁有R資源的P行為。
結束語權限系統一直以來是我們應用系統不可缺少的一個部分,若每個應用系統都重新對系統的權限進行設計,以滿足不同系統用戶的需求,將會浪費我們不少寶貴時間,所以花時間來設計一個相對通用的權限系統是很有意義的。
設計一個相對通用的系統是很有意義的。(不僅僅是權限)
多交流,多分享,書寫更好的代碼。
享受編程和技術所帶來的快樂。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/11748.html
摘要:認為權限授權實際上是的問題。具體的權限,正向授權與負向授權。應用建模業務場景權限管理鑒權設計應用建模系統架構上支撐權限系統靈活配置,不僵硬字段,不僵硬行為,基于各種業務權限管控的特征靈活設計。表示許可權與角色之間多對多的指派關系。 序 之前寫過一篇大話權限中心的PHP架構之道,主要是從軟件工程角度介紹,如何通過編碼規范、依賴管理、數據源架構、事務處理、單元測試等技術,來保障權限系統的高...
摘要:從年月開始,的開發由作者目前就職贊助。武器一覽無線運營播種機模型動態表單屬性中心標簽系統權限中心模型位置管理一切皆位置回到主題,下面就為大家詳細介紹下,我們如何玩耍。場景包括頁面緩存限速器頁面性能分析狀態統計智能提醒異常線路。 Redis-簡介 Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value數據庫,并提供多種語言的API。從2...
摘要:權限中心的依賴聲明聲明依賴關系檢查代碼規范聲明開發依賴命名空間檢查代碼規范,執行單元測試。單元測試持續交付一切都如此的完美,沒有測試,又如何可以證明這件事情的完美,又如何可以保障交付的質量。 序 權限管理是無線運營系統中的核心模塊,通過訪問控制策略的配置,來約定人與資源的訪問關系。 本文著重講解如何通過PHP來構建一個靈活、通用、安全的權限管理系統。 關于權限 首先我們來聊聊權限。 權...
摘要:平均每月孵化個頁面的全視角覆蓋范圍業務支持周年慶,旅游節,營銷,專題,主題游,頻道頁涉及品類跟團,自助自駕門票當地酒店簽證機票金融通信攻略玩法超級自由行下面請跟隨大喇叭,一睹運營播種機的前世今生。發布,支持超級自由行模塊配置。 序 人生短短幾個秋,不醉不罷休。 CMS即將迎來2周歲生日,服務期間生產了*2200+*個內容頁面。(平均每月孵化100個頁面) CMS的全視角: 覆蓋范圍(...
閱讀 2893·2021-11-23 09:51
閱讀 3404·2021-11-22 09:34
閱讀 3305·2021-10-27 14:14
閱讀 1504·2019-08-30 15:55
閱讀 3345·2019-08-30 15:54
閱讀 1066·2019-08-30 15:52
閱讀 1888·2019-08-30 12:46
閱讀 2845·2019-08-29 16:11