shiro 學習之會話管理

摘要

shiro 的會話管理基本都寫好了捺檬,可以直接用它默認的再层,也可以關閉它的會話用自己的。這很開放堡纬,當然我肯定不會自己寫聂受,直接用它的,有個別需求的還可以實現(xiàn)它的接口自己寫烤镐,對著它的實現(xiàn)去修改蛋济,也不是很難。


項目地址:https://github.com/thecattle/spring-mvc-shiro


下面主要從兩方面說一下炮叶。

  • session 管理
  • cookie 管理(記住我-rememberMe)

session

在 shiro.xml 中碗旅,如下 我僅僅是設置超時時間為40分鐘渡处,默認30分鐘。

  • globalSessionTimeout:全局 session 過期時間祟辟,單位是 毫秒
  • cache:對于 session 管理可以配置 cache医瘫,可以集成 ehcache,redis 等旧困。不設置默認使用內(nèi)存作為緩存醇份。
  • sessionDao: 主要實現(xiàn) session 的增刪改查,有個性化需求可以自己實現(xiàn)吼具,在此不多啰嗦僚纷,有需要可以自己去看DefaultWebSessionManager。

說到DefaultWebSessionManager這個類拗盒,sessionManager的實現(xiàn)類大概有兩個:

  • DefaultWebSessionManager:它支持 web 容器的 session 管理怖竭,可以滿足大多數(shù)應用。如果不配置 session 管理陡蝇,默認就是這貨侵状。
  • ServletContainerSessionManager:它只支持Servlet容器的 session 管理,web 的 session 都管理不了毅整,特定需求下可以用這個趣兄。具體的可以看這個實現(xiàn)類的說明,英文我怕翻譯出歧義悼嫉。艇潭。。
<!--session管理 配置-->
    <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
        <!--session 過期時間 單位 毫秒戏蔑,2400000=40min-->
        <property name="globalSessionTimeout" value="2400000"></property>

        <!--有需要可以自行配置-->
        <!--<property name="cacheManager" ref="xxxx"></property>-->
        <!--有需要可以自行配置-->
        <!--<property name="sessionDAO" ref="xxx"></property>-->
    </bean>

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        ......
        <!--配置 session 管理-->
        <property name="sessionManager" ref="sessionManager"></property>
        </property>
        ......
    </bean>
<bean id="shiroFilter" class="com.sunp.shiro.MyShiroFilterFactoryBean">
        <!-- Shiro的核心安全接口蹋凝,這個屬性是必須的 -->
        <property name="securityManager" ref="securityManager"/>
        ......
    </bean>

rememberMe

在登錄的時候可以看到這句代碼:

image.png

說實話這功能看起來挺屌的,知道原理后感覺好 low总棵,但整體來說還是很實用的鳍寂。
這東西到底是干嘛的呢。引用官方的解釋:

假設您正在使用Amazon.com情龄。您已成功登錄迄汛,并已將幾本圖書添加到購物車。但是你必須跑出一個會議骤视,但忘記注銷鞍爱。在會議結束的時候,現(xiàn)在是回家专酗,離開辦公室的時候了睹逃。
第二天,當你上班祷肯,你意識到你沒有完成你的購買沉填,所以你回到amazon.com疗隶。這一次,亞馬遜記得“你是誰”翼闹,通過名字來迎接你斑鼻,還給你一些個性化的書籍推薦。進入亞馬遜橄碾,subject.isRemembered()會返回 true卵沉。但是颠锉,如果您嘗試訪問您的帳戶以更新信用卡信息以使您的圖書購買法牲,會發(fā)生什么?
雖然亞馬遜記得你(isRemembered()== true)琼掠,但不能保證你實際上是你(例如拒垃,也許同事使用你的電腦)。因此瓷蛙,在您執(zhí)行敏感操作(如更新信用卡信息)之前悼瓮,亞馬遜將強制您登錄,以確保您的身份艰猬。登錄后横堡,您的身份已經(jīng)通過驗證,isAuthenticated()是true冠桃。對于許多類型的應用程序命贴,這種情況發(fā)生得如此頻繁,因此功能內(nèi)置于Shiro食听,因此您可以將其用于自己的應用程序⌒刂耄現(xiàn)在,無論您使用isRemembered()還是isAuthenticated()
自定義您的視圖和工作流程都取決于您樱报,但是葬项,如果您需要,Shiro將保持此基本狀態(tài)迹蛤。

看完這個故事民珍,應該能猜到,isAuthenticated為 true 說明我在登錄狀態(tài)盗飒,isRemembered為 true 說明我登錄過穷缤,就是這么簡單。難怪我上某寶的時候經(jīng)陈崾蓿看到自己是在線的津肛,下單的時候卻還要我登錄。我心里無數(shù)次罵過這網(wǎng)站是不是有病汗贫,老子在線呢你還要我登錄身坐,麻不麻煩秸脱,現(xiàn)在看到這個才恍然大悟阳掐,很慚愧擒悬,虧我還是碼農(nóng)。跑題了狐胎,說正事

作為碼農(nóng)了解到它的用處之后涯鲁,而且還這么簡單就一句代碼巷查,肯定是要看下效果的。

但是都不知道怎么實現(xiàn)的抹腿,都不知道怎么樣看到效果岛请,我去網(wǎng)上查了很久,沒查到警绩。想到是不是 session 過期了就行呢崇败,嘗試了下果然成功了。猜到結果是isRemembered是根據(jù) cookie 過沒過期來判斷的肩祥。后來配置 cookie 過期時間的時候發(fā)現(xiàn)果然是這樣后室。但我還是不知道,怎么通過源碼去知道是通過 cookie過期時間判斷混狠,大神可以指點下我岸霹,小弟感激不盡。

說說remember的 cookie 的配置:
在 DefaultWebSecurityManager 中注入CookieRememberMeManager這個實現(xiàn)類
CookieRememberMeManager中的參數(shù)是 cookie将饺,用SimpleCookie這個實現(xiàn)類

  • maxAge:cookie 的超時時間贡避,單位是 秒
  • SimpleCookie構造函數(shù):要傳入這個 cookie 的名字,默認有個名字
 <!--rememberMeManager管理 配置-->
    <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
        <property name="cookie">
            <bean class="org.apache.shiro.web.servlet.SimpleCookie">
                <!--設置超時時間 單位 秒俯逾,一天=86400-->
                <constructor-arg value="shiro-cookie"></constructor-arg>
                <property name="maxAge" value="86400"></property>
            </bean>
        </property>
    </bean>
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        ......
        <!--配置 記住我-->
        <property name="rememberMeManager" ref="rememberMeManager"></property>
        ......
    </bean>
<bean id="shiroFilter" class="com.sunp.shiro.MyShiroFilterFactoryBean">
        <!-- Shiro的核心安全接口贸桶,這個屬性是必須的 -->
        <property name="securityManager" ref="securityManager"/>
        ......
    </bean>

認證和記住兩個狀態(tài)的區(qū)分

說了這么多也都理解了,但是在代碼中有個問題是要注意的:
currentUser.isRemembered()和currentUser.isAuthenticated()這個兩個狀態(tài)永遠永遠都是相反的桌肴。一個為 true 一個必定為 false皇筛。除非你去重寫他們的方法。

shiro 這么做是有道理的坠七。
你是認證狀態(tài)的時候水醋,去做認證的能做事情。
你是認證記住我的時候彪置,去做記住我能做的事情拄踪。
這屬于兩個權限級別。

測試

通過設置 session 和 cookie 的超時時間拳魁,去做這個測試:
session 設置10分鐘
cookie 設置20分鐘

通過接口可以看到一開始是這樣的:
currentUser.isAuthenticated()返回 true
currentUser.isRemembered()返回 false
超過10分鐘之后
currentUser.isAuthenticated()返回 false
currentUser.isRemembered()返回 true

在此不上截圖惶桐,可以自己去測試

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子姚糊,更是在濱河造成了極大的恐慌贿衍,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件救恨,死亡現(xiàn)場離奇詭異贸辈,居然都是意外死亡,警方通過查閱死者的電腦和手機肠槽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門擎淤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人秸仙,你說我怎么就攤上這事嘴拢。” “怎么了筋栋?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵炊汤,是天一觀的道長正驻。 經(jīng)常有香客問我弊攘,道長,這世上最難降的妖魔是什么姑曙? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任襟交,我火速辦了婚禮,結果婚禮上伤靠,老公的妹妹穿的比我還像新娘捣域。我一直安慰自己,他們只是感情好宴合,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布焕梅。 她就那樣靜靜地躺著,像睡著了一般卦洽。 火紅的嫁衣襯著肌膚如雪贞言。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天阀蒂,我揣著相機與錄音该窗,去河邊找鬼。 笑死蚤霞,一個胖子當著我的面吹牛酗失,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昧绣,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼规肴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起拖刃,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤鉴嗤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后序调,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體醉锅,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年发绢,在試婚紗的時候發(fā)現(xiàn)自己被綠了硬耍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡边酒,死狀恐怖经柴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情墩朦,我是刑警寧澤坯认,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站氓涣,受9級特大地震影響牛哺,放射性物質發(fā)生泄漏。R本人自食惡果不足惜劳吠,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一引润、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧痒玩,春花似錦淳附、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至草讶,卻和暖如春洽糟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背到涂。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工脊框, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人践啄。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓浇雹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親屿讽。 傳聞我的和親對象是個殘疾皇子昭灵,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容