- 什么是權限管理
基本涉及到用戶參與的系統都要進行權限管理,權限管理屬於系統安全的范疇,權限管理實現對用戶訪問系統的控制,按照安全規則或者安全策略控制用戶可以訪問而且只能訪問自己被授權的資源。
權限管理包括用戶身份認證和授權兩個部分,簡稱認證授權。對於需要訪問控制的資源用戶首先經過身份認證,認證通過后用戶具有該資源的訪問權限方可訪問。
1.2. 用戶身份認證
1.2.1. 概念:身份認證就是判斷一個用戶是否為合法用戶的處理過程。最常用的簡單身份認證方式是系統通過對用戶輸入的用戶名和口令,看起是否與系統中儲存的該用戶的用戶名和口令一致,來判斷用戶身份是否正確。對於采用指紋等系統,則初始指紋;對於硬件key等刷卡系統,則需要刷卡。
1.2.2. 用戶名密碼身份認證流程。
1.2.3. 關鍵對象:
Subject:主體,訪問系統的用戶,程序等,進行認證的都稱為主體。
Principal:身份信息,是主體進行身份認證的表示,表示必須具有唯一性,如用戶名、手機號、郵箱地址等,一個主體可以有多個身份,但必須有一個主身份。(primary principal)
credential:憑證信息,是只有主體才知道的安全信息,如密碼、證書等。
1.3. 授權
1.3.1. 概念:授權即訪問控制,控制誰能訪問哪些資源。主體進行身份認證后需要分配權限方可訪問系統資源,對於某些資源沒有權限是無法訪問的。
1.3.2. 授權流程。
1.3.3. 關鍵對象
授權可理解為who對what(which)進行how操作:
who,即主體(Subject),主體需要訪問系統中的資源。
what,即資源(Resource),如系統菜單,頁面,按鈕,類方法信息等。資源包括資源類型和資源實例(用戶類:資源類型和用戶對象:資源實例)。
how,權限/許可(Permission),規定了主體對資源的操作許可,權限離開資源沒有意義,通過權限可知主體對哪些資源都有哪些操作許可。
權限分為粗顆粒和細顆粒,粗顆粒權限是指對資源類型的權限,細顆粒權限是對資源實例的權限。
主體,資源,權限關系圖:
1.3.4. 權限模型
主體,資源,權限通過數據模型表示。
主體(賬號,密碼)
資源(資源名稱、訪問地址)
權限(權限名稱、資源id)
角色(角色名稱)
角色和權限關系(角色id和權限id)
主體和角色關系(主體id和角色id)
企業開發把資源和權限合並為一張表,
資源(資源名稱,訪問地址)
權限(權限名稱,資源id)
合並:
權限(權限名稱,資源名稱,資源訪問地址)
1.3.5. 權限分配:
對主體分配權限,主體只允許在權限范圍內對資源進行操作,權限分配的數據需要持久化,根據上邊的數據模型城建表並將用戶的權限信息儲存在數據庫中。
1.3.6. 權限控制
用戶擁有權限即可操作權限范圍內的資源,系統不知道主體是否具有訪問權限需要對用戶的訪問進行控制。
1.3.6.1. 基於角色的訪問控制
RBAC基於角色的訪問控制()是以角色為中心進行訪問控制。比如:主體的角色為總經理可以查詢企業運營報表。
缺點:一角色進行訪問控制粒度較粗,若主體變為總經理和經理則需要修改代碼,可擴展性差。
1.3.6.2. 基於資源的訪問控制
RBAC基於資源的訪問控制()是以資源為中心進行訪問控制,比如:主體必須具有查詢工資的權限才可以查詢工資。
有點:系統設計時定義好查詢工資的全西安表示,即查詢工資所需要的角色變化為總經理和部門經理也只需要將“查詢工資的權限”添加到部門經理角色的權限列表中,判斷邏輯不用修改,系統可擴展性強。
- 權限管理解決方案:
1.1. 粗顆粒度和細顆粒度
1.1.1. 什么是粗顆粒度和細顆粒度
對資源類型的管理稱為粗顆粒度權限管理,即只控制到菜單,按鈕,方法,粗顆粒度例子:用戶具有用戶管理的權限,具有到處訂單明細的權限。
對資源實例的管理稱為細顆粒度權限管理,即控制到數據級別的權限,比如:用戶只允許修改本部門的員工信息,用戶只允許到處自己創建的訂單明細。
1.1.2. 如何實現粗顆粒度和細顆粒度
對於粗顆粒度的權限管理可以很容易做系統架構級別的功能,即系統功能操作使用統一的粗顆粒度的權限管理。
對於細顆粒度的權限管理不建議做成系統架構級別的功能,因為對數據級別的控制是系統的業務需求,隨着業務需求的變更業務功能的可能性大,建議對數據級別的權限控制在業務層跟杏花開發,比如:用戶只允許修改自己創建的商品信息可以在service接口添加校驗實現,service接口需要傳入當前操作人的表示,與商品信息創建人標識對比,不一致則不允許修改商品信息。
1.2. 基於url攔截
基於url攔截是企業中常用的權限管理方法,實現思路:將系統操作的每個url配置在權限表中,將權限對應到角色,將角色分配給用戶,用戶訪問系統功能通過Filter進行過濾,過濾器獲取到用戶訪問的url,只要訪問url是用戶分配角色中的url則放行繼續訪問。
以下是模型圖: