Shiro簡單授權原理分析

2022-09-24 01:42:07 字數 2457 閱讀 5626

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匹配,則返回trueauthorizingrealm對於判斷hasrole的邏輯也很簡單protected boolean hasrole(string roleidentifier, authorizationinfo info) 而對於subject.ispermitted(...)稍微會顯得複雜一些,前三步都一樣,就是authorizingrealm對於判斷ispermitted的邏輯稍微有點不一樣。它會先將許可權字串轉換成permission,將使用者的許可權轉換成list,這裡的list由三個部分組成:

通過authorizationinfo.getobjectpermissions()得到permission例項集合 通過authorizationinfo. getstringpermissions()得到字串集合並通過permissionresolver解析為permission例項 然後獲取使用者的角色,並通過rolepermissionresolver解析角色對應的許可權集合(預設沒有實現,可以自己提供)

而jdbcrealm的實現是使用了stringpermissions,可能第一想法以為它是用了rolepermissionresolver吧。

好了,接下來,用permission和list進行匹配,其中遍歷使用者許可權的匹配方法就是implies(...),這個單詞可以理解成「蘊含」的意思,這樣就比較好理解了。

private boolean ispermitted(permission permission, authorizationinfo info) }}

return false;

}舉個例子,比如user:*許可權impliesuser:create許可權,這就是一種蘊含關係。

一般有程式設計式和宣告式兩種:

程式設計式:subject subject = securityutils.getsubject();

if(subject.hasrole(「admin」)) else 宣告式:@requiresroles(admin)

public void hello() 沒有許可權的話就丟擲相應的異常。而我們只需要捕獲異常做出相應的處理就可以了,在spring中是可以配置乙個全域性的exceptionhandler的。當然在spring3.2之後的版本還提供了@controlleradvice來增強controller,其中定義的所有@exceptionhandler方法將會應用於所有的@requestmapping方法,那麼我們可以這麼來定義異常處理類:

}當然對於程式設計式的也可以直接使用subject.checkroles(「admin」),這樣一來也會丟擲異常並被exceptionhandler捕獲了。

這裡若啟用宣告式的鑑權,還需要啟用aspectj自動**,並支援對類的**。

Shiro簡單授權原理分析

shiro授權簡單來說分為兩種型別 粗粒度的 也就是 中直接寫入和角色的繫結。細粒度的 中寫入的是和許可權的繫結,而角色到許可權和可配置的。對於粗粒度來說,若角色對應許可權有改變的話,那麼則需要更改 很不方便。而細粒度的好處顯而易見,所以一般專案中應該都採用細粒度的許可權配置。那麼shiro中是如何...

Shiro 認證與授權分析

使用者訪問系統資源時的認證流程如下 具體流程分析如下 1 系統呼叫subject的login方法將使用者資訊提交給securitymanager 2 securitymanager將認證操作委託給認證器物件authenticator 3 authenticator將身份資訊傳遞給realm。4 re...

Shiro入門(六)Shiro授權

本章講解shiro授權的相關知識 1.概念 authorization 授權,也就是授予使用者訪問某些資源的許可權。前提在於需要使用者通過登入驗證才可以進行授權。許可權 permit 表示某些功能,如按鈕的顯示,選單的訪問,資料的crud 角色 role 許可權的集合,比如管理員角色,其擁有訪問系統...