shiro安全控制目錄
門(mén)面模式的本質(zhì)就是化零為整:引入一個(gè)中介類(lèi),把各個(gè)分散的功能組合成一個(gè)整體,只對(duì)外暴露一個(gè)統(tǒng)一的接口。門(mén)面模式實(shí)現(xiàn)了SecurityManager的功能模塊化,如圖1所示。

用戶(hù)只是簡(jiǎn)單的調(diào)用Subject API,而無(wú)需關(guān)心SecurityMananger中各個(gè)功能之間的相互調(diào)用。
1. subject類(lèi)
用戶(hù)在shiro中用subject表示,使用的默認(rèn)類(lèi)是org.apache.shiro.web.subject.support.WebDelegatingSubject,包含的參數(shù),如圖2所示。

subject的生命周期:
- 每一次訪問(wèn)都會(huì)創(chuàng)建一個(gè)新的subject對(duì)象。
- 將創(chuàng)建的subject對(duì)象綁定到ThreadContext上,之后通過(guò)SecurityUtils便可以在程序的任何地方獲取到Subject對(duì)象。
- 每一次創(chuàng)建完成subject,都會(huì)通過(guò)SubjectDAO將subject屬性存放到session中去,但是只存放principal(身份)和authenticated(是否校驗(yàn)成功)。
2. subjectDAO
subject在創(chuàng)建完成之后,都會(huì)通過(guò)org.apache.shiro.mgt.DefaultSubjectDAO,將subject的屬性保存到session中去。但是決定是否進(jìn)行保存是由sessionStorageEvaluator參數(shù)進(jìn)行控制的。
使用session來(lái)持久化保存Subject的principal(身份)和authenticated(是否校驗(yàn)成功)。在Session中保存Subject信息后,通過(guò)cookie上送的sessionId,shiro便可以根據(jù)session來(lái)重建Subject實(shí)例。
用戶(hù)每次請(qǐng)求,均使用session重建subject對(duì)象,那么我們可以修改session中的身份信息,以實(shí)現(xiàn)用戶(hù)非重新登錄,便可獲取到最新的身份信息principal。
源碼參考:org.apache.shiro.mgt.DefaultSubjectDAO#mergePrincipals
但是在無(wú)狀態(tài)認(rèn)證中,請(qǐng)求每次攜帶token,每次都要經(jīng)過(guò)身份認(rèn)證。通常就不需要session來(lái)存儲(chǔ)此狀態(tài)。便可以禁止存儲(chǔ),如代碼1所示。
代碼1:禁止session存儲(chǔ)subject信息。
@Bean
public DefaultSubjectDAO defaultSubjectDAO() {
return new DefaultSubjectDAO() {
@Override
protected boolean isSessionStorageEnabled(Subject subject) {
return false;
}
};
}