權限管理:實現對用戶訪問系統的控制,按照安全規則或策略控制用戶只能訪問自己被授權的資源。
用戶認證:驗證用戶身份合法性。
關鍵對象:
subject:主體(用戶/程序),訪問系統資源
principal:身份信息,唯一性。一個主體可擁有多個身份信息,但是都有一個主身份信息(primary principal)
credential:憑證信息,密碼/指紋/證書
主體在進行身份認證時需要提供相應的身份信息和憑證信息。
用戶授權:用戶認證通過後,對用戶訪問的資源進行控制,具有訪問權限纔可訪問。 -- 訪問控制
授權過程:who 對 what/which 進行 how 操作
who:主體subject,subject在認證通過後系統進行訪問控制
what/which:資源resource,subject必須幾倍資源的訪問權限纔可以訪問該資源
資源Resource:對比類與實例
資源類型:系統的用戶信息
資源實例:系統中id爲001的用戶 -- 資源類型的具體化
how:權限/許可permission,subject必須具有permisson纔可以訪問資源。permission權限比如:CURD
分配權限:
用戶需要分配相應的權限纔可訪問相應的資源,權限是對資源的操作許可。資源權限需要持久化存儲,存儲在關係數據庫中。
權限模型:
權限控制:授權核心
基於角色的訪問控制:不利於系統維護,拓展。
基於資源的訪問控制:
資源在系統中是不變的,對資源的訪問需要permission。變更權限只需要分配在權限模塊上去操作。
權限管理解決方案:
粗粒度和細粒度權限:
粗粒度權限管理,是對資源類型的權限管理
細粒度權限管理,是對資源實例的權限管理 -- 數據級別的權限管理
如何實現粗粒度的權限管理?
將權限管理的代碼抽取出來,在系統架構級別進行統一處理。 例如:通過springmvc攔截器實現授權
如何實現細粒度的權限管理?
在數據級別的是沒有共性的細粒度的權限管理就是業務邏輯的一部分,在業務層進行處理。
解決方案:
基於URL攔截的方式實現:springmvc配置攔截器
攔截器模式下,將需要攔截進行判斷處理的url進行集中處理,每次請求均會攔截,此時對用戶身份認證(登錄)會產生多次的數據庫查詢請求,這裏的解決方案一方面是將用戶的信息(基本信息,權限信息 -- 可訪問的url等)存入Session/cache。
基於權限管理框架的實現:shiro權限管理框架
小結:
使用基於url攔截的方式,實現起來比較簡單,不依賴框架,僅適用web容器提供的filter即可(springmvc下是interceptor),需要將所有的url進行登記配置。但是配置繁瑣,不易於維護,url和權限的表示方式不規範。