shiro(5)-Subject(用戶(hù))

shiro安全控制目錄

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

圖1-shiro和門(mén)面模式.png

用戶(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所示。

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

subject的生命周期:

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

文章參考

shiro學(xué)習(xí)01-用戶(hù)以及登錄-Subject類(lèi)

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

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

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