1. 程式人生 > 實用技巧 >Shiro Realm 許可權的驗證流程和快取機制

Shiro Realm 許可權的驗證流程和快取機制

我們可以定義多個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、後端、架構、阿里巴巴等大廠最新面試題

覺得不錯,別忘了點贊+轉發哦!