1. 程式人生 > >shiro(一) : 許可權控制介紹

shiro(一) : 許可權控制介紹

許可權管理

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

許可權管理包括使用者認證授權兩部分。shiro也是基於此來進行設計實現的

使用者認證

使用者認證一般流程如下:

關鍵物件

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

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

credential:憑證資訊,可以是密碼 、證書、指紋。

使用者授權

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

授權流程如下:

關鍵物件

授權的過程理解:who對what(which)進行how操作。

who:主體即subject,subject在認證通過後系統進行訪問控制。

what(which):資源(Resource),subject必須具備資源的訪問許可權才可訪問該 資源。資源比如:系統使用者列表頁面、商品修改選單、商品id為001的商品資訊。

how:許可權/許可(permission) ,針對資源的許可權或許可,subject具有permission訪問資源,如何訪問/操作需要定義permission,許可權比如:使用者新增、使用者修改、商品刪除。

許可權模型
  • 主體(賬號、密碼)
  • 角色(角色名稱)
  • 許可權(許可權名稱、資源id)
  • 資源(資源名稱、訪問地址)
  • 角色和許可權關係(角色id、許可權id)
  • 主體和角色關係(主體id、角色id)

許可權模型圖如下:

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

分配許可權

  • 1)使用者需要分配相應的許可權才可訪問相應的資源。許可權是對於資源的操作許可。
  • 2)通常給使用者分配資源許可權需要將許可權資訊持久化,比如儲存在關係資料庫中。
  • 3)把使用者資訊、許可權管理、使用者分配的許可權資訊寫到資料庫(許可權資料模型)

許可權控制(授權核心)

基於角色的訪問控制

RBAC(role based access control),基於角色的訪問控制。 比如: 系統角色包括 :部門經理、總經理。。(角色針對使用者來劃分)

系統程式碼中實現:

//如果該user是部門經理則可以訪問if中的程式碼
if(user.hasRole('部門經理')){
	//系統資源內容
	//使用者報表檢視
}
基於資源的訪問控制

RBAC(Resource based access control),基於資源的訪問控制。

資源在系統中是不變的,比如資源有:類中的方法,頁面中的按鈕。

對資源的訪問需要具有permission許可權,程式碼可以寫為:

if(user.hasPermission ('使用者報表檢視(許可權識別符號)')){
	//系統資源內容
	//使用者報表檢視
}

許可權管理解決方案

什麼是粗粒度和細粒度許可權

粗粒度許可權管理,對資源型別的許可權管理。資源型別比如:選單、url連線、使用者新增頁面、使用者資訊、類方法、頁面中按鈕。。

細粒度許可權管理,資料級別的許可權管理。比如:部門經理只可以訪問本部門的員工資訊,使用者只可以看到自己的選單,大區經理只能檢視本轄區的銷售訂單。。

如何實現粗粒度和細粒度許可權管理

  • 如何實現粗粒度許可權管理?

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

  • 如何實現細粒度許可權管理?

對細粒度許可權管理在資料級別是沒有共性可言,針對細粒度許可權管理就是系統業務邏輯的一部分,如果在業務層去處理相對比較簡單,如果將細粒度許可權管理統一在系統架構級別去抽取,比較困難,即使抽取的功能可能也存在擴充套件不強。

基於url攔截的方式實現
    1. 基於url攔截的方式實現在實際開發中比較常用的一種方式。
    1. 對於web系統,通過filter過慮器實現url攔截,也可以springmvc的攔截器實現基於url的攔截。
使用許可權管理框架實現
  • 對於粗粒度許可權管理,建議使用優秀許可權管理框架來實現,節省開發成功,提高開發效率。
  • shiro就是一個優秀許可權管理框架。