摘要:例如,系統中某個用戶辭職了,只需要將系統中該用戶的角色授權撤銷即可。
Q0.有哪些概念需要知道?
一些概念的具體定義如下
用戶(user): 和計算機系統交互的人(在許多設計方案中,單個用戶可能擁有多個登錄標識(ID),這些標識可能同時處于活躍狀態,但身份驗證機制可以使多個標識匹配到某個具體的人,即用戶對于計算機系統來說具有唯一性)
主體(subject): 一個代表用戶行為的計算機進程(可以看成是用戶的agent)
客體(object): 計算機系統中任意可訪問的資源
操作(operation): 由客體觸發的活動進程
權限(permission): 系統中授權可以執行的動作,即客體和操作的組合
角色: 不同權限或角色(職責)的集合
會話(session) : 用戶和系統交互的實例
Q1.什么是RBAC?請自行參考百度百科和維基百科
核心概念:用戶通過指派角色而獲取相應的權限,而非直接把權限賦予用戶
Q2.RBAC為什么通過角色來為用戶分配權限,而不直接把權限賦予用戶?通常用戶和權限的關系變更頻繁,而角色和權限的關系則相對穩定。例如,系統中某個用戶辭職了,只需要將系統中該用戶的角色授權撤銷即可。
Q3.RBAC0,RBAC1,RBAC2,RBAC3有什么聯系?RBAC0總結:
元素: 用戶,角色,權限,組成權限的操作,操作對應的客體
映射: 用戶-角色,角色-權限(角色與角色,角色與權限之間沒有多層繼承)
權限: 綁定在在計算機操作和資源客體上的抽象概念(操作 + 客體)
RBAC基礎模型的動態組件包括: 角色激活和主體訪問
主體: 能夠訪問處于控制下的角色、操作和客體的活動實體(主體代表用戶完成其所有請求,主體到用戶應是單一映射,而用戶到主體則不一定),這個概念主要出現在動態模型中
RBAC1總結:
基于rbac0,與rbac0的區別是角色之間可以多層繼承
使用多層角色的原因:單一角色通常出現功能重疊的現象(屬于不同角色的用戶都會被授予一些一般性權限)
連接器角色:通常不直接賦予用戶;可以包含任意的權限集,作為抽象功能,抽象職責,抽象任務或抽象活動(便于重用);通常如果在角色中有80%或更多的權限重疊,那么就可以選擇創建一個連接器角色;
RBAC2總結:
基于rbac0,與rbac0的區別是增加約束概念(主要是職責分離約束)
職責分離(SoD): 關鍵操作必須由兩個或更多的人來完成,這樣任何一個人都不可能多帶帶的破壞安全系統(所以在rbac中滿足職責分離約束即有效角色A和有效角色B對應的用戶集合不能有交集)
職責分離方法: 靜態和動態方法
靜態職責分離模型:在為用戶指派角色時,就為角色施加約束(例如,如果為某用戶授予角色A,就不能再為其授予角色B)
動態職責分離模型:用戶以活動狀態使用系統時其約束才會發揮作用(例如,它可以同時賦予某用戶角色A和角色B,但不允許在一個會話中同時充當兩個角色)
Q4.在編碼實踐中RBAC模塊可能包含什么?用戶管理:用戶的增刪改查
角色管理:角色的增刪改查
權限管理:權限的增刪改查
日志管理:日志的增刪改查
授權與撤銷授權操作
資源管理:資源的增刪改查(注意:這里的資源指的是那些需要被rbac模塊進行權限管理的資源)
權限判斷操作:提供用于判斷權限的接口(常見形式如:checkAccess(user,role,params))
會話管理:即對用戶在當前交互中的活動角色進行管理
Q5.身份鑒別與rbac中權限授予的區別與聯系?權限授予和身份鑒別是訪問控制的基礎
正確的權限授予事實上依賴于身份鑒別
身份鑒別是確定“你是誰“的過程;權限授予則是確定”你能干什么“的過程(即權限授予機制對用戶是否可以訪問系統資源做出”是“或”否“的決定)
Q6.在RBAC1中如何設計權限繼承結構?以下僅為個人經驗
分析系統,列出一些可能存在的角色
分析系統,列出所有需要被管理的資源
對每種資源列出所有需要被管理的操作
根據每種資源的每種操作,組合出所有的基本(操作,資源)(只分析需要進行權限管理的),形成"最底層permission"
對所有當前存在的permission構成的集合進行逐層劃分(按照最小權限原則,并聯系可能存在的角色)
根據上一步的劃分,在每一個分界處提取出角色(其中可能包含連接器角色)
整理以上的工作,得到基本權限繼承結構
對基本權限繼承結構中的元素進行分析,確定是否需要附加rule(rule可以用于確保是在滿足一些前置條件的情況下進行權限判定,rule不一定非要附加在permission或role上,也可以附加于assignment上,看實際編碼時的考慮)
將帶有rule的"permission"作為其"最底層permission"的上層權限,最后如果"最底層permission"沒有上層角色,則可以考慮從結構中刪除
整理并回顧,優化每個元素的命名
如果在第7步中不選擇在permission或role上附加rule,則需要考慮如何在assignment上附加rule
Q7.在實際項目中會經常遇到角色是基于某種資源的情況,該如何處理?問題的具體描述:
在某一系統中,資源(客體)A需要進行權限管理。(A指的是一類資源,假設其中包括具體的該類資源a,b,c...)
存在用戶u,u可以訪問(access)A類資源中的a和b
用戶u對于資源a被賦予角色r1,u對于資源b被賦予角色r2
需要如何實現rbac使得其滿足以上需求?
Answer:
通常需要在rbac添加一個新的基本元素rule,rule的作用在于:當進行權限判定時,限定前置條件。
rule可以附加在permission,role或assignment(即某個用戶賦予某種角色:(user,role))中,在判定權限過程中,需要執行rule
對應于上面的問題,可以添加一張表T,T中的每條記錄包含(user,resourceA,role),執行rule的目的是判斷(u,a,r1)或(u,b,r2)存在于表T中
個人偏向于在assignment中綁定rule,這樣可以使權限繼承結構更為清晰
Q8.在實現rbac時,進行權限判定的具體邏輯是怎樣的?通常在實現的時候會用到遞歸,下面以YII2中提供的代碼為例(源碼在yii2中的位置為vendoryiisoftyii2 bacDbManager.php,這里的代碼刪減了一些無關的內容)
public function checkAccess($userId, $permissionName, $params = []) { $assignments = $this->getAssignments($userId);//先查找當前用戶的已經授予的所有角色 if ($this->hasNoAssignments($assignments)) { return false;//如果沒有任何授權的話,當然是判定失敗 } //遞歸 return $this->checkAccessRecursive($userId, $permissionName, $params, $assignments); } protected function checkAccessRecursive($user, $itemName, $params, $assignments) { if (($item = $this->getItem($itemName)) === null) { return false;//如果所要判定的permission或role根本不存在,自然判定失敗 } //需要判定的item存在,先執行當前Item的rule,rule可以用于執行一些業務邏輯 if (!$this->executeRule($user, $item, $params)) { return false; } //如果當前需要判定的role確實授予了該用戶,那么就可以返回true,結束遞歸 if (isset($assignments[$itemName]) || in_array($itemName, $this->defaultRoles)) { return true; } //獲取當前Item的上一層item,遞歸判定 $query = new Query; $parents = $query->select(["parent"]) ->from($this->itemChildTable) ->where(["child" => $itemName]) ->column($this->db); foreach ($parents as $parent) { if ($this->checkAccessRecursive($user, $parent, $params, $assignments)) { return true; } } return false; }
在上面的代碼中可以看到,當中使用了rule,在yii2中可以在permission或role中綁定相應的rule(但在assignment中無法綁定rule),引入rule可以解決Q7中的問題
為了實現在assignment中綁定rule,以下是經過修改后的代碼(除了checkAccessRecursive方法需要修改外,還有其他的相關方法需要修改,但此處就不列出了,具體可以查看github項目:https://github.com/Darkgel/tr...)
protected function checkAccessRecursive($user, $itemName, $params, $assignments) { if (($item = $this->getItem($itemName)) === null) { return false; } if (!$this->executeRule($user, $item, $params)) { return false; } if(in_array($itemName, $this->defaultRoles)){ return true; } //這里添加了對assignment中的rule進行判斷 if (isset($assignments[$itemName])) { $assignment = $assignments[$itemName]; if($this->executeRule($user, $assignment, $params)){ return true; } } $query = new Query; $parents = $query->select(["parent"]) ->from($this->itemChildTable) ->where(["child" => $itemName]) ->column($this->db); foreach ($parents as $parent) { if ($this->checkAccessRecursive($user, $parent, $params, $assignments)) { return true; } } return false; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30664.html
摘要:年初開始研究,至目前已發表近篇學習筆記。同時,他也是中國社區的活躍者,見證了中國社區的一路成長。經本人授權,從本周開始,中國將轉載他的學習筆記,由淺入深地分享他在學習過程中的收獲。節點包含的組件目前這三個組件需要部署在同一臺機器上。 作者:宋凈超 宋凈超(Jimmy Song),TalkingData 容器技術負責人,微服務和云原生應用布道者。2017 年初開始研究 Kubernete...
摘要:數據庫設計的三大范式確保每列的原子性如果每列都是不可再分的最小單元信息,則滿足第一范式,比如下圖中,地址是由國家和城市組成的,顯然可以繼續在拆分成兩個列,國家和城市,是不滿足第一范式的,需要將地址列差分成國家和城市兩個列。 showImg(https://segmentfault.com/img/remote/1460000018997429?w=1100&h=546); 閱讀原文 ...
摘要:近來部門接到一個外包項目,是基于現有的系統做一個知識文檔庫,類似于百度網盤一樣的功能,只是在角色和權限上與網盤不同,這個項目我們部門稱為,,難點就在于文件的權限管理。 ??近來部門接到一個外包項目,是基于現有的系統做一個知識文檔庫,類似于百度網盤一樣的功能,只是在角色和權限上與網盤不同,這個項目我們部門稱為KM,Knowledge Manager ,難點就在于文件的權限管理。 ??以下...
閱讀 3748·2021-11-24 10:46
閱讀 1710·2021-11-15 11:38
閱讀 3768·2021-11-15 11:37
閱讀 3488·2021-10-27 14:19
閱讀 1946·2021-09-03 10:36
閱讀 1995·2021-08-16 11:02
閱讀 3004·2019-08-30 15:55
閱讀 2258·2019-08-30 15:44