shiro授權簡單來說分為兩種型別:
粗粒度的:也就是**中直接寫入和角色的繫結。
細粒度的:**中寫入的是和許可權的繫結,而角色到許可權和可配置的。
對於粗粒度來說,若角色對應許可權有改變的話,那麼則需要更改**,很不方便。而細粒度的好處顯而易見,所以一般專案中應該都採用細粒度的許可權配置。
那麼shiro中是如何來完成許可權檢驗的呢?
通過呼叫subject.hasroles(...)
或subject.ispermitted(...)
另外還有subject.checkroles(...)
或subject.checkpermissions(...)
前兩種和後兩種的區別是,後兩種在沒有許可權時會丟擲異常。
關於角色,相信你都會定義,因為就是乙個名字,比如admin、vip、user等。
而對於許可權的定義,就需要有一套規則了。在shiro中我們可以這麼來定義許可權字串:資源識別符號:操作:物件例項id。另外這裡支援萬用字元配置,
比如:
user:create
表示對user有create的許可權(這裡省略了:物件例項id,等價於user:create:*
)
user:*
表示對user擁有所有操作的許可權(create,update,delete,view)
user:view:1
表示對user的1例項有view的許可權
差不多就類似這樣,就不多說了。shiro內部會有乙個permissionresolver來負責將這類字串解析為permission物件。
下面分析一下授權的流程:
當我們呼叫subject.hasrole(...)
後
首先會委託給securitymanager來處理,而securitymanager內部有乙個authorizer來做真正的授權,預設實現為modularrealmauthorizermodularrealmauthorizer可以根據多個realm來判斷是否擁有相應的角色,其中只要某個realm匹配,則返回true
authorizingrealm對於判斷hasrole的邏輯也很簡單
protected
boolean
hasrole
(string
roleidentifier
,authorizationinfo
info
)
而對於subject.ispermitted(...)
稍微會顯得複雜一些,前三步都一樣,就是authorizingrealm對於判斷ispermitted的邏輯稍微有點不一樣。它會先將許可權字串轉換成permission,將使用者的許可權轉換成list
,這裡的list
由三個部分組成:
而jdbcrealm的實現是使用了stringpermissions,可能第一想法以為它是用了rolepermissionresolver吧。
好了,接下來,用permission和list進行匹配,其中遍歷使用者許可權的匹配方法就是implies(...)
,這個單詞可以理解成「蘊含」的意思,這樣就比較好理解了。
private
boolean
ispermitted
(permission
permission
,authorizationinfo
info)}
}return
false
;}
舉個例子,比如user:*
許可權impliesuser:create
許可權,這就是一種蘊含關係。
一般有程式設計式和宣告式兩種:
}當然對於程式設計式的也可以直接使用subject.checkroles(「admin」)
,這樣一來也會丟擲異常並被exceptionhandler捕獲了。
這裡若啟用宣告式的鑑權,還需要啟用aspectj自動**,並支援對類的**。
proxy-target-
class
="true"
/>
class
="org.apache.shiro.spring.security.interceptor.authorizationattributesourceadvisor"
>
<
property
name
="securitymanager"
ref=
"securitymanager"
/>
Shiro簡單授權原理分析
shiro授權簡單來說分為兩種型別 粗粒度的 也就是 中直接寫入和角色的繫結。細粒度的 中寫入的是和許可權的繫結,而角色到許可權和可配置的。對於粗粒度來說,若角色對應許可權有改變的話,那麼則需要更改 很不方便。而細粒度的好處顯而易見,所以一般專案中應該都採用細粒度的許可權配置。那麼shiro中是如何...
Shiro 認證與授權分析
使用者訪問系統資源時的認證流程如下 具體流程分析如下 1 系統呼叫subject的login方法將使用者資訊提交給securitymanager 2 securitymanager將認證操作委託給認證器物件authenticator 3 authenticator將身份資訊傳遞給realm。4 re...
Shiro入門(六)Shiro授權
本章講解shiro授權的相關知識 1.概念 authorization 授權,也就是授予使用者訪問某些資源的許可權。前提在於需要使用者通過登入驗證才可以進行授權。許可權 permit 表示某些功能,如按鈕的顯示,選單的訪問,資料的crud 角色 role 許可權的集合,比如管理員角色,其擁有訪問系統...