1. 程式人生 > >Shior 框架進階(五)----------授權

Shior 框架進階(五)----------授權

                                                                          Shior 框架進階(五)

                                                                                                         ----------授權

授權流程原理 

授權

授權,也叫訪問控制,即在應用中控制誰能訪問哪些資源(如訪問頁面/編輯資料/頁面操作等)。在授權中需瞭解的幾個關鍵物件:主體 (Subject)、資源(Resource)、許可權(Permission)、角色(Role)。

主體(Subject)  主體,即訪問應用的使用者,在Shiro中使用Subject代表該使用者。使用者只有授權後才允許訪問相應的資源。

資源(Resource) 在應用中使用者可以訪問的任何東西,比如JSP 頁面、某些資料、某個業務方法等等都是資源。使用者只要授權後才能訪問。

許可權(Permission) 許可權表示在應用中使用者能不能訪問某個資源, 如:訪問使用者列表頁面檢視/新增/修改/刪除使用者資料(即很多時候都是CRUD(增查改刪)式許可權控制)列印文件等等。

角色(Role) 角色代表了操作集合,可以理解為許可權的集合,一般情況下我們會賦予使用者角色而不是許可權,即這樣使用者可以擁有一組許可權,賦予許可權 時比較方便。 典型的如:專案經理、技術總監、CTO、開發工程師等都是角色,不同的角色擁有一組不同的許可權。

判斷是否授權的方式 

Shiro 支援三種方式的授權判斷: 

程式設計式

通過寫if/else 授權程式碼塊完成: 

Subject subject = SecurityUtils.getSubject();  if(subject.hasRole(“admin”)) 

{        

//有許可權 

 } else {   

//無許可權 

註解式

通過在執行的Java方法上放置相應的註解完成: 

@RequiresRoles("admin") 

public void hello() {    

 //有許可權 

 }

JSP 標籤 在JSP 頁面通過相應的標籤完成: 

<shiro:hasRole name="admin"> 

  <!— 有許可權—> 

</shiro:hasRole> 

  1. 配置ini檔案 shiro­authorization.ini 

#使用者

[users]

#使用者Sulliven的密碼是123456,此使用者具有role1和role3兩個角色

helen=123456,role1,role3

lisi=123456,role2

#角色和許可權

[roles]

role1=system:user:*,system:menu:*

role2=system:user:list

role3=system:config:* 

  1. 判斷角色和許可權

注意:首先要認證

public class AuthorizationTest {

  // 角色授權、資源授權測試    

@Test    

public void testAuthorization() {

        //=================認證開始:以下和前面認證的測試一致

        // 建立SecurityManager工廠        

IniSecurityManagerFactory factory =

new IniSecurityManagerFactory("classpath:shiro-authorization.ini");

// 建立SecurityManager        

SecurityManager securityManager = factory.getInstance();       

 // 將securityManager設定當前的執行環境中        

SecurityUtils.setSecurityManager(securityManager);        

// 從SecurityUtils裡邊建立一個subject        

Subject subject = SecurityUtils.getSubject();       

 // 在認證提交前準備token(令牌)       

 // 這裡的賬號和密碼 將來是由使用者輸入進去        

UsernamePasswordToken token = new UsernamePasswordToken("Sulliven", "123456");        

// 執行認證提交     

subject.login(token);

// 是否認證通過        

boolean isAuthenticated = subject.isAuthenticated();       

 System.out.println("是否認證通過:" + isAuthenticated);

// 退出操作(不要退出登入)        

//subject.logout();

// 是否認證通過        

//isAuthenticated = subject.isAuthenticated();        

//System.out.println("是否認證通過:" + isAuthenticated);

//=================認證結束         //=================授權開始

// 認證通過後執行授權        

//(1)基於角色的授權       

//(1.1) hasRole傳入角色標識:單個角色判斷        

boolean ishasRole = subject.hasRole("role1");        

System.out.println("單個角色判斷" + ishasRole);

  //(1.2)hasRole傳入角色標識:多個角色判斷        

boolean[] hasRoles = subject.hasRoles(Arrays.asList("role1", "role2"));        

System.out.println("當前使用者是否擁有以下角色:");        

for (boolean b : hasRoles) {           

      System.out.println(b);       

 }  

//(1.3)hasAllRoles是否同時擁有以下多個角色:多個角色判斷        

boolean hasAllRoles = subject.hasAllRoles(Arrays.asList("role1", "role3"));        

System.out.println("多個角色判斷" + hasAllRoles); 

//(1.4)除了has這之後角色的判斷還有check方法不會主動丟擲異常,但是需要捕獲  

//(2)基於資源的授權        

//(2.1)isPermitted傳入許可權識別符號:單個許可權判斷      

 boolean isPermitted = subject.isPermitted("system:user:create");        

System.out.println("是否有許可權:" + isPermitted);

  //(2.2)多個許可權判斷        

boolean isPermittedAll = subject.isPermittedAll("system:user:list", "system:config:list");        

System.out.println("多個許可權判斷:" + isPermittedAll);        

//(2.3)使用check方法進行授權檢測,如果授權不通過會丟擲異常        

try {            

subject.checkPermission("system:config:list");        

} catch (AuthorizationException e) {          

 System.out.println("許可權未定義");            

e.printStackTrace();       

 }    

}

}

以上就是對授權的一個簡單的展示,以及各種檢測授權的方法

注意的是:一般我們一不同的角色來給與不同的許可權,也就是通過給使用者分配角色來達到分配許可權的目的;

但是在實際運用當中我們是通過shiro來授權包括檢驗,所以以後是不會在ini檔案中授予角色的,所以下一篇會為大家帶來之前提及的自定義realm來完成授權。

敬請期待!!!!!!