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>
- 配置ini檔案 shiroauthorization.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:*
- 判斷角色和許可權
注意:首先要認證
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來完成授權。
敬請期待!!!!!!