1. 程式人生 > >【shiro】(1)---了解權限管理

【shiro】(1)---了解權限管理

變更 而且 要去 行政 核心 使用 用戶信息 sub 角色

了解權限管理

一、概念

1、什麽是權限管理

只要有用戶參與的系統一般都要有權限管理,權限管理實現對用戶訪問系統的控制,按照安全規則或者安全策略控制用戶可以訪問而且只能訪問自己被授權的資源。

權限管理包括用戶認證和授權兩部分。

(1)用戶認證

用戶認證,用戶去訪問系統,系統要驗證用戶身份的合法性。最常用的用戶身份驗證的方法:1、用戶名密碼方式、2、指紋打卡機、3、基於證書驗證方法。。系統驗證用戶身份合法,用戶方可訪問系統的資源。

關鍵對象

subject:主體,理解為用戶,可能是程序,都要去訪問系統的資源,系統需要對subject進行身份認證。

principal:身份信息,通常是唯一的,一個主體還有多個身份信息,但是都有一個主身份信息(primary principal)

credential:憑證信息,可以是密碼 、證書、指紋。

總結主體在進行身份認證時需要提供身份信息和憑證信息。

(2)用戶授權

用戶授權,簡單理解為訪問控制,在用戶認證通過後,系統對用戶訪問資源進行控制,用戶具有資源的訪問權限方可訪問。

二、權限模型

1、六張表模型

主體(賬號、密碼)

資源(資源名稱、訪問地址)

權限(權限名稱、資源id)

角色(角色名稱)

角色和權限關系(角色id、權限id)

主體和角色關系(主體id、角色id)

如下圖:

技術分享圖片

2、經典五張表

通常企業開發中將資源和權限表合並為一張權限表,如下:

資源(資源名稱、訪問地址)

權限(權限名稱、資源id)

合並為:

權限(權限名稱、資源名稱、資源訪問地址)

技術分享圖片

三、權限控制(授權核心)

權限控制一般有兩種模式:一種是基於角色來分配權限。另一種是基於資源來分配權限

1、基於角色的訪問控制

比如:

系統角色包括 :部門經理、總經理。。(角色針對用戶來劃分對於的訪問權限)

系統代碼中實現:

//如果該user是部門經理則可以訪問if中的代碼
if(user.hasRole(‘部門經理‘)){ //系統資源內容 //用戶報表查看 }

問題:

因為基於角色來做訪問控制,那麽上面這樣在代碼裏是寫死的,一旦邏輯改變,就不利於維護,比如:本來只有“部門經理”才有訪問這個頁面的權利,但後來邏輯有變“總經理”也可以訪問該頁面。

比如:需要變更為部門經理和總經理都可以進行用戶報表查看,代碼要改為:

if(user.hasRole(‘部門經理‘) || user.hasRole(‘總經理‘)  ){
    //系統資源內容
    //用戶報表查看
}

所以說:基於角色的訪問控制是不利於系統維護(可擴展性不強)。

2、基於資源的訪問控制

什麽是資源,我的理解,只要是頁面顯示的都可以理解為資源,uri也是資源。

資源是可以數據庫中配置,換句話說我們是可以通過頁面的權限模塊,進行配置的。這樣我們就不用修改代碼了,可維護性強。

//這裏的權限標識符可以理解你在數據庫配置了uri權限資源,那這裏可以理解判斷該用戶有沒有該頁面的訪問權限
if(user.hasPermission (‘權限標識符(比如url)‘)){
    //系統資源內容
    //用戶報表查看
}

上邊的方法就可以解決用戶角色變更不用修改上邊權限控制的代碼。

如果需要變更權限只需要在分配權限模塊去操作,給部門經理或總經理增或刪除權限。

總結:

建議使用基於資源的訪問控制實現權限管理。

四、權限管理解決方案

1 什麽是粗粒度和細粒度權限

(1)粗粒度權限管理:對資源類型的權限管理。資源類型比如:菜單、url連接、用戶添加頁面、用戶信息、頁面中按鈕。

粗粒度權限管理比如:

超級管理員可以訪問戶添加頁面、用戶信息等全部頁面。

部門管理員可以訪問用戶信息頁面包括 頁面中所有按鈕。

(2)細粒度權限管理:對資源實例的權限管理。資源實例就資源類型的具體化。

細粒度權限管理就是數據級別的權限管理。

細粒度權限管理比如:部門經理只可以訪問本部門的員工信息,用戶只可以看到自己的菜單,大區經理只能查看本轄區的銷售訂單。。

粗粒度和細粒度例子:

系統有一個用戶列表查詢頁面,對用戶列表查詢分權限,如果粗顆粒管理,張三和李四都有用戶列表查詢的權限,張三和李四都可以訪問用戶列表查詢。

進一步進行細顆粒管理,張三(行政部)和李四(開發部)只可以查詢自己本部門的用戶信息。張三只能查看行政部 的用戶信息,李四只能查看開發部門的用戶信息。

2、如何實現粗粒度和細粒度權限管理

(1) 如何實現粗粒度權限管理?

粗粒度權限管理比較容易將權限管理的代碼抽取出來在系統架構級別統一處理。比如:通過springmvc的攔截器實現授權。

(2) 如何實現細粒度權限管理?

建議細粒度權限管理在業務層去控制(意思是說通過邏輯代碼來控制)。

比如:

部門經理只查詢本部門員工信息,在service接口提供一個部門id的參數,controller中根據當前用戶的信息得到該 用戶屬於哪個部門,調用service時將部門id傳入service,實現該用戶只查詢本部門的員工。

想太多,做太少,中間的落差就是煩惱。想沒有煩惱,要麽別想,要麽多做。少校【2】

【shiro】(1)---了解權限管理