1. 程式人生 > >[Shrio使用總結]-詳解shiro配置檔案

[Shrio使用總結]-詳解shiro配置檔案

使用shrio就不得不對shiro的架構進行分析,筆者分析一個框架一般從它的配置檔案入手,可以快速瞭解整個框架的大體結構。

詳解securityManager配置:

<!-- shiro安全管理器  設定cacheManage,下列屬性有實現CacheManagerAware介面的,都會自動注入快取管理器-->  
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">  
    <property name="cacheManager" ref="cacheManager" /> 
    <property name="realm" ref="monitorRealm" />  
    <property name="sessionManager" ref="shiroSessionManager" />  
    <property name="rememberMeManager" ref="rememberMeManager"/>
</bean>  

以上配置是securityManager自動注入快取管理器的經典模式。如:DefaultWebSecurityManager
通過property屬性配置的ref引用,預設呼叫該物件的set方法進行注入。呼叫完成後會相應呼叫一個回撥方法
詳解shiroSessionManager管理器如何管理各個子管理器:(以注入session管理器為例)
1.1當session管理器注入時,回撥:

public void setSessionManager(SessionManager sessionManager) {
    this.sessionManager = sessionManager;
    afterSessionManagerSet();
}

在after回撥方法裡,設定快取管理器:

protected void afterSessionManagerSet() {
    applyCacheManagerToSessionManager();
}
protected void applyCacheManagerToSessionManager() {
    if (this.sessionManager instanceof CacheManagerAware) {
        ((CacheManagerAware) this.sessionManager).setCacheManager(getCacheManager());
    }
}

1.2當快取管理器注入時,回撥:
protected void afterCacheManagerSet() {
super.afterCacheManagerSet();
applyCacheManagerToSessionManager();
}

基本上,shiro框架中,所有的管理器如:都採用以上的注入回撥的方式,實現了管理器互相引用的方式。shiro的子管理器有以下這些:
DefaultWebSecurityManager、
DefaultSecurityManager(RememberMeManager rememberMeManager) extends RememberMeManager沒有使用快取
SessionsSecurityManager(SessionManager sessionManager) extends
AuthorizingSecurityManager(Authorizer authorizer) extends
AuthenticatingSecurityManager(Authenticator authenticator) extends
RealmSecurityManager(Collection realms) extends
CachingSecurityManager(CacheManager cacheManager) implements SecurityManager, Destroyable, CacheManagerAware
SecurityManager extends Authenticator, Authorizer, SessionManager;

詳解RealmSecurityManager管理器:
在securityManager配置了 ,
會呼叫到RealmSecurityManager的setRealm方法:
public void setRealm(Realm realm) {
if (realm == null) {
throw new IllegalArgumentException(“Realm argument cannot be null”);
}
Collection realms = new ArrayList(1);
realms.add(realm);
setRealms(realms);
}
public void setRealms(Collection realms) {
if (realms == null) {
throw new IllegalArgumentException(“Realms collection argument cannot be null.”);
}
if (realms.isEmpty()) {
throw new IllegalArgumentException(“Realms collection argument cannot be empty.”);
}
this.realms = realms;
afterRealmsSet(); //依次回撥許可權realm和身份realm設定相應的許可權模組資訊authorizer、身份模組資訊authenticator
}
//在子類中過載並依次回撥
//1.AuthorizingSecurityManager
protected void afterRealmsSet() {
super.afterRealmsSet();//回撥上層的set方法
if (this.authorizer instanceof ModularRealmAuthorizer) {
((ModularRealmAuthorizer) this.authorizer).setRealms(getRealms());
}
}
//2.AuthenticatingSecurityManager
protected void afterRealmsSet() {
super.afterRealmsSet();
if (this.authenticator instanceof ModularRealmAuthenticator) {
((ModularRealmAuthenticator) this.authenticator).setRealms(getRealms());
}
}
//RealmSecurityManager管理器呼叫applyCacheManagerToRealms,將快取管理器新增給每個realm
protected void afterRealmsSet() {
applyCacheManagerToRealms();
}
protected void applyCacheManagerToRealms() {
CacheManager cacheManager = getCacheManager();
Collection realms = getRealms();
if (cacheManager != null && realms != null && !realms.isEmpty()) {
for (Realm realm : realms) {
if (realm instanceof CacheManagerAware) {
((CacheManagerAware) realm).setCacheManager(cacheManager);
}
}
}
}

realm物件:注入到securityManager安全管理器中,會設定給身份驗證資訊與許可權驗證資訊作為資料來源
這樣身份驗證管理器與許可權驗證管理器就可以獲取到realm資料來源,進行相應的管理操作
realm管理器持有的realms資源主要是用來給realm物件設定快取器
RealmSecurityManager( Collection realms;)

許可權realm資料來源:
AuthorizingRealm extends AuthenticatingRealm
implements Authorizer, Initializable, PermissionResolverAware, RolePermissionResolverAware ;
身份realm資料來源:
AuthenticatingRealm extends CachingRealm implements Initializable;
快取CachingRealm:
CachingRealm implements Realm, Nameable, CacheManagerAware, LogoutAware

通過realm獲取許可權驗證資訊、身份驗證資訊,首先通過快取管理器查詢,若快取無資料,則通過doGet方法查詢相應的資料。

realm資料來源資訊結構:
許可權驗證資訊:
AuthorizationInfo,該使用者具有的哪些許可權
身份驗證資訊:
AuthenticationInfo,該使用者的身份資訊、密碼

詳解許可權AuthorizingSecurityManager與身份驗證管理器AuthenticatingSecurityManager
預設使用以下兩個物件進行驗證管理:
許可權模組:
ModularRealmAuthorizer implements Authorizer,,( Collection realms;)
身份模組:
ModularRealmAuthenticator extends AbstractAuthenticator ( Collection realms;)

詳解shiro快取管理器CacheManager:
使用到快取的地方有:
1.session管理器
2.身份驗證資訊realm
3.許可權驗證資訊realm
快取物件的結構: Cache