shiro(5)-Subject(用戶)

shiro安全控制目錄

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

圖1-shiro和門面模式.png

用戶只是簡單的調(diào)用Subject API,而無需關(guān)心SecurityMananger中各個功能之間的相互調(diào)用。

1. subject類

用戶在shiro中用subject表示,使用的默認(rèn)類是org.apache.shiro.web.subject.support.WebDelegatingSubject,包含的參數(shù),如圖2所示。

圖2-subject的參數(shù).png

subject的生命周期:

  1. 每一次訪問都會創(chuàng)建一個新的subject對象。
  2. 將創(chuàng)建的subject對象綁定到ThreadContext上,之后通過SecurityUtils便可以在程序的任何地方獲取到Subject對象。
  3. 每一次創(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;
            }
        };
    }

文章參考

shiro學(xué)習(xí)01-用戶以及登錄-Subject類

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容