我們可以定義多個Realm權限類,繼承AuthenticatingRealm,
如果是這樣,那Shiro驗證的策略和順序是怎樣的呢?
策略
通過查看原始碼,Shiro的Spring Boot自動配置是至少一個通過策略,即有一個權限類通過就判定有權限并通過,
自動配置類:
org.apache.shiro.spring.config.web.autoconfigure.ShiroWebAutoConfiguration
@Bean
@ConditionalOnMissingBean
@Override
protected AuthenticationStrategy authenticationStrategy() {
return super.authenticationStrategy();
}
protected AuthenticationStrategy authenticationStrategy() {
return new AtLeastOneSuccessfulStrategy();
}
其他還有全部通過、首個通過,更多可以查看Shiro包下面的權限策略,
org.apache.shiro.authc.pam
順序
Shiro是按在Spring Boot配置類中定義Realm Bean的順序進行驗證權限的,
驗證流程
假設現在有R1,R2權限類,現在我們對一個方法或者路徑配置了A角色,B、C權限,Shiro會在R1中找A角色,找到則繼續驗證其他權限,找不到根據策略決定,如果說不是全部都要通過的策略則會繼續在R2中找A角色,找不到則跳到指定的未授權鏈接,B、C權限驗證流程也是一致,
Shiro快取
為了權限驗證的效率性能,Shiro對認證和授權是有快取開關控制的,
需要了解的權限類層次是,每個Realm都繼承AuthorizingRealm,AuthorizingRealm繼承自AuthenticatingRealm,AuthenticatingRealm是認證的邏輯,AuthorizingRealm是授權的邏輯,
通過查看AuthorizingRealm和AuthenticatingRealm原始碼,默認的認證快取是關閉的,授權快取是開啟的,
authorizationCachingEnabled = true; // 授權
authenticationCachingEnabled = false; // 認證
這里默認開啟了快取還不行,還需要設定CacheManager,如下,
@Bean
public CacheManager cacheManager() {
return new MemoryConstrainedCacheManager();
}
具體的快取邏輯可以翻閱以下原始碼,
org.apache.shiro.realm.AuthorizingRealm#getAuthorizationInfo
org.apache.shiro.realm.AuthenticatingRealm#getAuthenticationInfo
設定快取開關
有的時候我們的權限不是固定的,需要動態的調整授權,所以希望某些Realm不需要快取,
我們可以在當前Realm中手動關閉某它的的授權快取,
this.setAuthorizationCachingEnabled(false);
同上,默認關閉的認證的快取也可以通過設定進行打開,
根據具體的業務進行靈活調整,
推薦去我的博客閱讀更多:
1.Java JVM、集合、多執行緒、新特性系列教程
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
4.Java、后端、架構、阿里巴巴等大廠最新面試題
覺得不錯,別忘了點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/80799.html
標籤:Java
上一篇:Java記憶體模型 - 簡介
