Shiro 入门教程 - Shiro RememberMe

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析


阶段4、深入jdk其余源码解析


阶段5、深入jvm源码解析

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】

RememberMe

Shiro 提供了记住我(RememberMe)的功能,比如访问如淘宝等一些网站时,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问,基本流程如下:

  1. 首先在登录页面选中 RememberMe 然后登录成功;如果是浏览器登录,一般会把 RememberMe 的 Cookie 写到客户端并保存下来;
  2. 关闭浏览器再重新打开;会发现浏览器还是记住你的;
  3. 访问一般的网页服务器端还是知道你是谁,且能正常访问;
  4. 但是比如我们访问淘宝时,如果要查看我的订单或进行支付时,此时还是需要再进行身份认证的,以确保当前用户还是你。

RememberMe 配置

spring-shiro-web.xml 配置 :

    <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
        <constructor-arg value="sid"/>
        <property name="httpOnly" value="true"/>
        <property name="maxAge" value="-1"/>
    </bean>
    <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
        <constructor-arg value="rememberMe"/>
        <property name="httpOnly" value="true"/>
        <property name="maxAge" value="2592000"/><!-- 30天 -->
    </bean>
  • sessionIdCookie:maxAge=-1 表示浏览器关闭时失效此 Cookie;
  • rememberMeCookie:即记住我的 Cookie,保存时长 30 天;
    `<!-- rememberMe管理器 -->`
    <bean id="rememberMeManager" 
    class="org.apache.shiro.web.mgt.CookieRememberMeManager">
        <property name="cipherKey" value="
    \#{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}"/>
         <property name="cookie" ref="rememberMeCookie"/>
    </bean>

rememberMe 管理器,cipherKey 是加密 rememberMe Cookie 的密钥;默认 AES 算法;

    `<!-- 安全管理器 -->`
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        ……
      <property name="rememberMeManager" ref="rememberMeManager"/>
    </bean>

设置 securityManager 安全管理器的 rememberMeManager;

    <bean id="formAuthenticationFilter" 
    class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">
        ……
        <property name="rememberMeParam" value="rememberMe"/>
    </bean>

rememberMeParam,即 rememberMe 请求参数名,请求参数是 boolean 类型,true 表示 rememberMe。

    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        ……
        <property name="filterChainDefinitions">
            <value>
                /login.jsp = authc
                /logout = logout
                /authenticated.jsp = authc
                /** = user
            </value>
        </property>
    </bean>

“/authenticated.jsp = authc” 表示访问该地址用户必须身份验证通过(Subject. isAuthenticated()==true);而 “/** = user” 表示访问该地址的用户是身份验证通过或 RememberMe 登录的都可以。

测试 :

  1. 访问 http://localhost:8080/chapter13/,会跳转到登录页面,登录成功后会设置会话及 rememberMe Cookie;
  2. 关闭浏览器,此时会话 cookie 将失效;
  3. 然后重新打开浏览器访问 http://localhost:8080/chapter13/,还是可以访问的;
  4. 如果此时访问 http://localhost:8080/chapter13/authenticated.jsp,会跳转到登录页面重新进行身份验证。

如果要自己做 RememeberMe,需要在登录之前这样创建 Token:UsernamePasswordToken(用户名,密码,是否记住我),如:

    Subject subject = SecurityUtils.getSubject();
    UsernamePasswordToken token = new UsernamePasswordToken(username, password);
    token.setRememberMe(true);
    subject.login(token);

subject.isAuthenticated() 表示用户进行了身份验证登录的,即使有 Subject.login 进行了登录; subject.isRemembered():表示用户是通过记住我登录的,此时可能并不是真正的你(如你的朋友使用你的电脑,或者你的 cookie 被窃取)在访问的;且两者二选一,即 subject.isAuthenticated()==true,则 subject.isRemembered()==false;反之一样。

另外对于过滤器,一般这样使用:
访问一般网页 ,如个人在主页之类的,我们使用 user 拦截器即可,user 拦截器只要用户登录 (isRemembered()==true or isAuthenticated()==true) 过即可访问成功;
访问特殊网页 ,如我的订单,提交订单页面,我们使用 authc 拦截器即可,authc 拦截器会判断用户是否是通过 Subject.login(isAuthenticated()==true)登录的,如果是才放行,否则会跳转到登录页面叫你重新登录。

因此 RememberMe 使用过程中,需要配合相应的拦截器来实现相应的功能,用错了拦截器可能就不能满足你的需求了。

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值