shiro 学习之会话管理

摘要

shiro 的会话管理基本都写好了,可以直接用它默认的,也可以关闭它的会话用自己的。这很开放,当然我肯定不会自己写,直接用它的,有个别需求的还可以实现它的接口自己写,对着它的实现去修改,也不是很难。


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


下面主要从两方面说一下。

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

session

在 shiro.xml 中,如下 我仅仅是设置超时时间为40分钟,默认30分钟。

  • globalSessionTimeout:全局 session 过期时间,单位是 毫秒
  • cache:对于 session 管理可以配置 cache,可以集成 ehcache,redis 等。不设置默认使用内存作为缓存。
  • sessionDao: 主要实现 session 的增删改查,有个性化需求可以自己实现,在此不多啰嗦,有需要可以自己去看DefaultWebSessionManager。

说到DefaultWebSessionManager这个类,sessionManager的实现类大概有两个:

  • DefaultWebSessionManager:它支持 web 容器的 session 管理,可以满足大多数应用。如果不配置 session 管理,默认就是这货。
  • ServletContainerSessionManager:它只支持Servlet容器的 session 管理,web 的 session 都管理不了,特定需求下可以用这个。具体的可以看这个实现类的说明,英文我怕翻译出歧义。。。
<!--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。您已成功登录,并已将几本图书添加到购物车。但是你必须跑出一个会议,但忘记注销。在会议结束的时候,现在是回家,离开办公室的时候了。
第二天,当你上班,你意识到你没有完成你的购买,所以你回到amazon.com。这一次,亚马逊记得“你是谁”,通过名字来迎接你,还给你一些个性化的书籍推荐。进入亚马逊,subject.isRemembered()会返回 true。但是,如果您尝试访问您的帐户以更新信用卡信息以使您的图书购买,会发生什么?
虽然亚马逊记得你(isRemembered()== true),但不能保证你实际上是你(例如,也许同事使用你的电脑)。因此,在您执行敏感操作(如更新信用卡信息)之前,亚马逊将强制您登录,以确保您的身份。登录后,您的身份已经通过验证,isAuthenticated()是true。对于许多类型的应用程序,这种情况发生得如此频繁,因此功能内置于Shiro,因此您可以将其用于自己的应用程序。现在,无论您使用isRemembered()还是isAuthenticated()
自定义您的视图和工作流程都取决于您,但是,如果您需要,Shiro将保持此基本状态。

看完这个故事,应该能猜到,isAuthenticated为 true 说明我在登录状态,isRemembered为 true 说明我登录过,就是这么简单。难怪我上某宝的时候经常看到自己是在线的,下单的时候却还要我登录。我心里无数次骂过这网站是不是有病,老子在线呢你还要我登录,麻不麻烦,现在看到这个才恍然大悟,很惭愧,亏我还是码农。跑题了,说正事

作为码农了解到它的用处之后,而且还这么简单就一句代码,肯定是要看下效果的。

但是都不知道怎么实现的,都不知道怎么样看到效果,我去网上查了很久,没查到。想到是不是 session 过期了就行呢,尝试了下果然成功了。猜到结果是isRemembered是根据 cookie 过没过期来判断的。后来配置 cookie 过期时间的时候发现果然是这样。但我还是不知道,怎么通过源码去知道是通过 cookie过期时间判断,大神可以指点下我,小弟感激不尽。

说说remember的 cookie 的配置:
在 DefaultWebSecurityManager 中注入CookieRememberMeManager这个实现类
CookieRememberMeManager中的参数是 cookie,用SimpleCookie这个实现类

  • maxAge:cookie 的超时时间,单位是 秒
  • SimpleCookie构造函数:要传入这个 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>

认证和记住两个状态的区分

说了这么多也都理解了,但是在代码中有个问题是要注意的:
currentUser.isRemembered()和currentUser.isAuthenticated()这个两个状态永远永远都是相反的。一个为 true 一个必定为 false。除非你去重写他们的方法。

shiro 这么做是有道理的。
你是认证状态的时候,去做认证的能做事情。
你是认证记住我的时候,去做记住我能做的事情。
这属于两个权限级别。

测试

通过设置 session 和 cookie 的超时时间,去做这个测试:
session 设置10分钟
cookie 设置20分钟

通过接口可以看到一开始是这样的:
currentUser.isAuthenticated()返回 true
currentUser.isRemembered()返回 false
超过10分钟之后
currentUser.isAuthenticated()返回 false
currentUser.isRemembered()返回 true

在此不上截图,可以自己去测试

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容