Shiro身份認證
身份認證:就是應用中誰能證明他就是他本人,一般提供如他們身份的ID、一些標識信息來表名他就是他本人,如提供身份證,用戶名、密碼來證明。
shiro中做身份認證的是Authenticator
,它是一個認證器,負責主體認證的,這是一個擴展點,如果用戶覺得默認實現不好,可以自定義實現。認證器需要認證策略,這個也需要自己實現。
認證流程
通過shiro認證的流程圖來說明認證內部的處理順序:
- 應用程序構建了一個終端用戶認證信息的
AuthenticationToken
實例類,然后調用subject.login
方法 -
Subject
的實例通常是DelegatingSubject
類的實例對象,在認證開始時,它會委托應用程序設置的SecurityManager
實例,調用securitymanager.login(token)
方法 -
SecurityManager
在接收到token令牌信息后,會委托內置的Authenticator
實例調用authenticator.authenticate(token)
來進行認證,這里面的Authenticator
實例通常使用的是ModularRealmAuthenticator
實例,ModularRealmAuthenticator
在認證過程中會對設置的一個或者多個Realm
實例進行適配,它實際上是為shiro提供了一個可插拔的認證機制。 - 如果我們在程序中配置了多個
Realm
,ModularRealmAuthenticator
會根據配置的AuthenticationStrategy
來進行多Realm
的認證過程,
在Realm
被調用后,AuthenticationStrategy
將會對每一個Realm的結果做出響應。
這里需要注意,如果應用程序中只配置了一個Realm
,Realm
將直接調用,而無需配置認證策略 - 我們需要判斷每一個
Realm
是否支持提交的AuthenticationToken
,如果支持,Realm
將調用getAuthenticationInfo(token)
方法,這個方法就是實際的認證處理,我們通過覆蓋Realm
的doGetAuthenticationInfo
方法來編寫我們自定義的認證處理即可。
Shiro授權
授權,也叫訪問控制,即在應用中控制誰能訪問哪些資源,比如訪問頁面、編輯數據、頁面操作等等。
在授權中,需要了解幾個關鍵的對象,主體 - subject
,資源 - resource
,權限 - permission
,角色 - role
授權流程
通過shiro的授權流程圖來說明shiro授權的處理順序:
- 首先會調用subject的
hasRole*
或者isPermitted*
方法來進行處理 - 它會委托給
SecurityManager
,而SecurityManager
接著會委托給Authorizer
-
Authorizer
是真正的授權者,比如判斷是否擁有user的查看權限,這時候調用方法isPermitted
,傳入參數是user:view
,
它首先會通過PermissionResolver
把字符串轉換成相應的Permission
實例,在進行授權之前,它會調用相應的realm獲取
subject相應的角色權限用于匹配傳入的角色權限, - 最后
Authorizer
會判斷realm的角色權限是否和傳入的匹配,如果有多個
realm,則會委托給ModularRealmAuthorizer
進行循環判斷,如果匹配,那么isPermitted
或者hasRole
方法會返回true,否則返回false表示授權失敗。