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

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

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