本文内容:Shiro 中RememberMe 功能的介绍以及实现。

1

介绍

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

基本流程如下:

1、首先在登录页面选中RememberMe然后登录成功;如果是浏览器登录,一般会把RememberMe的Cookie写到客户端并保存下来;

2、关闭浏览器再重新打开;会发现浏览器还是记住你的;

3、访问一般的网页服务器端还是知道你是谁,且能正常访问;

4、但是比如我们访问淘宝时,如果要查看我的订单或进行支付时,此时还是需要再进行身份认证的,以确保当前用户还是你。

关于拦截器

访问一般网页,如个人在主页之类的,我们使用user拦截器即可,user拦截器只要用户登录(isRemembered()==true||isAuthenticated()==true)通过即可访问成功;

访问特殊网页,如我的订单,提交订单页面,我们使用authc拦截器,authc拦截器会判断用户是否是通过

Subject.login(isAuthenticated()==true)

登录的,如果是才放行,否则会跳转到登录页面叫你重新登录。

关于rememberMecookie

shiro自动对用户对象序列化并加密. 当获得请求时, 能够获取反序列化且解密之后的用户对象。

当设置rememberMe==false, 将会自动清空rememberMe cookie.

不想要自动登录怎么办?

调用shirologout()方法, 即消除自动登录功能。

2

实现

ShiroConfig.java 中添加配置

注意:

cookieRememberMeManager.setCipherKey

传入参数为长度16位的byte[],否则会报Unable to init cipher instance:无法初始化密码实例的错误。

/**     * cookie对象;     * @return     */    public SimpleCookie rememberMeCookie(){        //这个参数是cookie的名称,对应前端的checkbox的name = rememberMe        SimpleCookie simpleCookie = new SimpleCookie("rememberMe");        //cookie生效时间30天,单位秒;        simpleCookie.setMaxAge(2592000);        return simpleCookie;    }/**     * cookie管理对象;记住我功能     * @return     */    public CookieRememberMeManager rememberMeManager(){        CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();        cookieRememberMeManager.setCookie(rememberMeCookie());        cookieRememberMeManager.setCipherKey("ZHANGXIAOHEI_CAT".getBytes());        return cookieRememberMeManager;    }

注入到SecurityManager

@Bean(name="securityManager")  public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm")UserRealm userRealm){    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();    //关联realm    securityManager.setRealm(userRealm);    //使用记住我    securityManager.setRememberMeManager(rememberMeManager());    return securityManager;  }

修改登录页面login.html

<body><h3 th:text="${msg}" style="color: red"></h3>    <form method="post" action="login">         用戶:<input type="text" id="userName" name="userName"/><br/>         密碼:<input type="password" id="password" name="password"/><br/>         <input type="checkbox" name="rememberMe">记住我<br>        <input type="submit" value="登录" id="sender" >     </form></body>

修改LoginController.java

@RequestMapping(value="/login",method = RequestMethod.GET)  public String toLogin(Model model) {    Subject subject = SecurityUtils.getSubject();      System.out.println(subject.isRemembered());    System.out.println(subject.isAuthenticated());    if(subject.isRemembered()){      System.out.println("-------------------------------------------------");            System.out.println("认证成功");            DzmHisMember member = (DzmHisMember)subject.getPrincipal();            model.addAttribute("member",member);            return "redirect:/toHome";        }    return "login";  }@RequestMapping(value="/login",method = RequestMethod.POST)  public String login(String userName,String password,boolean rememberMe,Model model)  {    /**     * 使用Shiro编写认证操作     *///1.获取Subject    Subject subject = SecurityUtils.getSubject();  //2.封装用户数据    UsernamePasswordToken token = new UsernamePasswordToken(userName,password);//3.执行登录方法    try {      System.out.println(rememberMe);      token.setRememberMe(rememberMe);      subject.login(token);      //登录成功,跳转到主页面      return "redirect:/toHome";    } catch (UnknownAccountException e) {      //登录失败:用户名不存在      model.addAttribute("msg", "用户名不存在");      return "login";    }catch (IncorrectCredentialsException e) {      //登录失败:密码错误      model.addAttribute("msg", "密码错误");      return "login";    }  }
  • 前一次登录勾选了记住我, 则本次登录时isRemembered()==true(如果上一次设置了rememberme, 本次登录是不会触发action中的login()的方法的, 即会直接进入登录状态)。

  • 经过shirologin()则表示为认证登录的. 就是说authentication==true. 访问权限最高.

  • rememberMe==true, 则将不会进入任何action. 可以访问所有user控制的页面或路径. 但不能访问authc控制的面或路径。

这里有个关键点:

subject.isAuthenticated()==true,则 subject.isRemembered()==false;

反之同理。

3

测试

在地址栏输入http://localhost:8080/hospital/login,第一次登陆时勾选“记住我”,登陆成功后关闭该页面;再在地址栏输入

http://localhost:8080/hospital/login会直接进入主页而不是登陆页面,控制台输出如下:

至此,本文结束。欢迎各位关注我的公众号:暗星涌动。

Shiro 实现 RememberMe 功能相关推荐

  1. Shiro的 rememberMe 功能使用指导(为什么rememberMe设置了没作用?)

    问题 shiro中提供了rememberMe功能,它用起来是这样的 UsernamePasswordToken token = new UsernamePasswordToken(loginForm. ...

  2. [shiro] - 加入rememberMe功能

    shiro不加入rememberMe没事,一加入就出错. RememberMeAuthenticationToken : public interface RememberMeAuthenticati ...

  3. Shiro实现rememberMe功能

    一.介绍 Shiro提供了记住我(RememberMe) 的功能,比如访问一些网站时,关闭了浏览器,下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问. 基本流程 首先在登录页面选中Remem ...

  4. Apache Shiro(七)——Shiro的RememberMe功能

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

  5. Shiro实现单一登录,并保留使用RememberMe功能。

    Shiro提供的功能结构图: Shiro详细的架构: Shiro中的各类过滤器 Filter Name Class anon org.apache.shiro.web.filter.authc.Ano ...

  6. Shiro学习之RememberMe功能实现

    目录 前言 更换MySQL数据库 一.更换依赖 二.更改配置 三.改换建表语句 Shiro的配置 控制层的改进 实际展示 咨询请找 前言 在网上看了一个开源的springboot项目,上面有非常全的s ...

  7. shiro的remember功能

    问题 shiro中提供了rememberMe功能,它用起来是这样的 UsernamePasswordToken token = new UsernamePasswordToken(loginForm. ...

  8. SpringBoot整合Shiro实现RememberMe

    接上Springboot Shiro实现用户验 shiro提供了RememberMe功能,用户登录状态不会因为浏览器的关闭而失效,知道cookie过期 更改ShiroConfig 加入cookie管理 ...

  9. 记住我remember-me功能的几种实现方式

    本文讨论几种记住我功能的实现方式. 原理:用户登录后,服务端为用户生成一个Token,并放入客户端Cookie中.下次用户登录,服务端验证Cookie中的Token并自动登录. 简单的Token生成方 ...

最新文章

  1. 面试 HTTP ,99% 的面试官都爱问这些问题!
  2. C/S架构和B/S架构的概念和区别
  3. Postgresql死锁的处理
  4. Hibernate, 想说爱你不容易
  5. 屏蔽 iOS 系统自动更新
  6. 【C#】VS2017 winform 打包
  7. SpringCloud 01_单体应用到分布式系统演变过程
  8. 3部世界顶级宇宙纪录片,献给对宇宙万物充满好奇的你
  9. 腾讯面试题:一条SQL语句执行得很慢的原因有哪些?
  10. UIButton 的简单运用
  11. php 创建目录_使用 Zephir 轻松构建 PHP 扩展
  12. D3 transtion
  13. reader技巧总结2.1.doc
  14. spring 跨域 CORS (Cross Origin Resources Share) 跨域
  15. 3D-GIS地理信息系统项目实施及目标
  16. 设计模式的七大原则——开闭原则(下)
  17. bzoj5148:[BeiJing2018]Kakuro
  18. 在武汉火车站转车需要出现吗_武汉火车站可以在站内换乘哪些站 武汉地铁6号线和1号线/13号线换乘...
  19. 计算机对逻辑算符的运算次序,逻辑运算符的优先顺序
  20. SPARQL 使用教程

热门文章

  1. js,数组合并的方法+数组添加元素的方法
  2. 赢在中国给80后的30条建议
  3. 产品心理学:晕轮效应
  4. DialogInterface.OnClickListener的使用
  5. emq集群配置nginx做负载均衡
  6. kubesphere部署weavescope
  7. 老色狼给小色狼的忠告
  8. parameterized插件在线安装
  9. http和https有什么区别?
  10. 二分查找算法(c++)