如,判斷一個用戶有查看頁面的權限,編輯數據的權限,擁有某一按鈕的權限,以及是否擁有打印的權限等等。
一、授權的三要素
授權有著三個核心元素:權限、角色和用戶。
權限
權限是Apache Shiro安全機制最核心的元素。它在應用程序中明確聲明了被允許的行為和表現。一個格式良好好的權限聲明可以清晰表達出用戶對該資源擁有的權限。
大多數的資源會支持典型的CRUD操作(create,read,update,delete),但是任何操作建立在特定的資源上才是有意義的。因此,權限聲明的根本思想就是建立在資源以及操作上。
而我們通過權限聲明僅僅能了解這個權限可以在應用程序中做些什么,而不能確定誰擁有此權限。
于是,我們就需要在應用程序中對用戶和權限建立關聯。
通常的做法就是將權限分配給某個角色,然后將這個角色關聯一個或多個用戶。
權限聲明及粒度
Shiro權限聲明通常是使用以冒號分隔的表達式。就像前文所講,一個權限表達式可以清晰的指定資源類型,允許的操作,可訪問的數據。同時,Shiro權限表達式支持簡單的通配符,可以更加靈活的進行權限設置。
下面以實例來說明權限表達式。
可查詢用戶數據
User:view
可查詢或編輯用戶數據
User:view,edit
可對用戶數據進行所有操作
User:* 或 user
可編輯id為123的用戶數據
User:edit:123
角色
Shiro支持兩種角色模式:
1、傳統角色:一個角色代表著一系列的操作,當需要對某一操作進行授權驗證時,只需判斷是否是該角色即可。這種角色權限相對簡單、模糊,不利于擴展。
2、權限角色:一個角色擁有一個權限的集合。授權驗證時,需要判斷當前角色是否擁有該權限。這種角色權限可以對該角色進行詳細的權限描述,適合更復雜的權限設計。
下面將詳細描述對兩種角色模式的授權實現。
二、授權實現
Shiro支持三種方式實現授權過程:
編碼實現
注解實現
JSP Taglig實現
1、基于編碼的授權實現
1.1基于傳統角色授權實現
當需要驗證用戶是否擁有某個角色時,可以調用Subject 實例的hasRole*方法驗證。
復制代碼 代碼如下:
Subject currentUser = SecurityUtils.getSubject();
if (currentUser.hasRole("administrator")) {
//show the admin button
} else {
//don't show the button? Grey it out?
}
相關驗證方法如下:
Subject方法描述hasRole(String roleName)當用戶擁有指定角色時,返回truehasRoles(List<String> roleNames)按照列表順序返回相應的一個boolean值數組hasAllRoles(Collection<String> roleNames)如果用戶擁有所有指定角色時,返回true
新聞熱點
疑難解答