Shiro學習筆記(4)-Shiro授權機制

前言

本文主要講解shiro的具體授權機制,這和上一篇所說的認證一樣屬於shiro提供的核心功能。

u8WZfe.png

授權相關要素

(1) Permissions:
簡單來說就是針對特定操作(crud…)或者針對特定資源的訪問權限,permission是單純的定義了一組具有訪問權限的操作(不決定誰具有訪問該操作的權限)。

(2) Roles :

角色代表了一組操作(權限)集合,角色通常會分配給特定的賬戶,並且一個用戶可以擁有多個角色。

隱式角色 :絕大多數的應用,會聲明一個角色,但是不會直接定義它的具體權限,只是我們印象中會有一組默認的權限。比如。我們定義了一個“admin”的角色,我們可能知道它是一個管理員,但是並不清楚它具體有哪些操作可以執行。我們需要在代碼中通過if/else的判斷來進行控制,這種方式在添加了新角色的時候需要加入大量代碼,比如我們加了另一個admin角色admin2,他也有admin1的權限那麼我們需要在判斷條件中進行額外的判斷,這樣子就很麻煩。

顯示角色: 顯示角色指的是我們通過最初就細粒度的定義角色的權限,比如admin的權限我們定義成add:*,表示admin具有add下的所有的權限,當權限控制精確到具體操作的時候,我們不需要在新加入角色的時候再次進行判斷,並且如果權限操作有所改變的時候比如admin只有delete下的deleteuser操作,我們只需要改成delete:deleteUser"就可以了。Shiro也推薦這種方法進行角色定義。

(3) Users : 用戶代表這個應用的使用者,Shiro中指的就是Subject。用戶擁有特定的角色或者權限來做具體的操作。

授權方式

編碼式授權

這種方式往往是最直接的也是最容易的,具體分爲兩種驗證方式:

(1)基於Role的授權 : 正如上面所說的可以通過隱式的判斷角色類型來進行權限驗證,操作方法如下

Subject currentUser = SecurityUtils.getSubject();

if (currentUser.hasRole("administrator")) {
    //show the admin button 
} else {
    //don't show the button?  Grey it out? 
} 

(2)基於Permission的授權 : 基於Permission的授權通過更細粒度的操作控制來更好的控制訪問權限,操作方法如下

Obejct-based

Permission printPermission = new PrinterPermission("laserjet4400n", "print");

Subject currentUser = SecurityUtils.getSubject();

if (currentUser.isPermitted(printPermission)) {
    //show the Print button 
} else {
    //don't show the button?  Grey it out?
}

String-based

Subject currentUser = SecurityUtils.getSubject();

if (currentUser.isPermitted("printer:print:laserjet4400n")) {
    //show the Print button
} else {
    //don't show the button?  Grey it out? 
}

基於註解的授權

Shiro支持基於註解的權限控制

(1) @RequiresAuthentication:當前用戶需要進行認證後才能操作

@RequiresAuthentication
public void updateUser(User user) {
}

(2) @RequiresGues:需要guest用戶(即能成功登陸的用戶)才能進行操作

@RequiresGuest
public void signUp(User user) {
...
} 

(3) @RequiresPermissions: 需要當前主題被授予了指定權限才能進行操作

@RequiresPermissions("user:create")
public void createUser(User user) {
 
}

(4) @RequiresRoles : 需要指定權限才能進行操作

@RequiresRoles("admin")
public void deleteUser(User user) {
 ... 
}

(5) @RequiresUser: 需要指定的用戶才能進行特定操作

@RequiresUser
public void updateUser(User user) {
  ...
}

授權機制

uLxxxS.png

  1. 首先通過Subject hasRole*, checkRole*, isPermitted*, or checkPermission*等方法變種將需要驗證的權限進行傳入。
  2. 委派SecurityManager 調用hasRole*, checkRole*, isPermitted*, or checkPermission* 等方法變種進行驗證
  3. SecurityManager再委派Authorizer調用hasRole*, checkRole*, isPermitted*, or checkPermission* 等方法變種進行驗證。默認是一個ModularRealmAuthorizer,可以同時驗證多個Realm。
  4. 最後再調用各自的Realm實現進行驗證。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章