简介

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

remember me配置

  • 测试用例:第十二章的示例,ideaProjects/shirochapter12
  • spring-shiro-web.xml:

    
    
        
        
        
    
    
    
        
        
        
    
    
    
    
    
        
        
    
    
    
  • sessionIdCookie:maxAge=-1表示浏览器关闭时Cookie失效。
  • rememberMeCookie:记住我的cookie,保存时长30天。
  • rememberMeManager:rememberMe管理器,cipherKey(cipher:密码)是加密RememberMe Cookie的密钥,默认AES算法。

    
    
        ……
        
    
    
    
        ……
        
            
                /login.jsp = authc
                /logout = logout
                /authenticated.jsp = authc
                /** = user
            
        
    
    
  • rememberMeParam:rememberMe请求参数名,请求参数是Boolean类型,true表示RememberMe。
  • /login.jsp = authc:用户必须通过身份验证Subject.login(),则Subject.isAuthenticated()==true;一般用于访问特殊网页,如,我的订单、提交订单页面。
  • /** = user:身份验证通过或记住我;一般用于普通网页,如,主页之类的。

  • 测试:

  1. 访问localhost:8080/chapter12/,跳转login页面,登录成功后会设置会话及rememberMeCookie;
  2. 关闭浏览器,会话cookie失效,但rememberMe有效;
  3. 重新打开浏览器访问localhost:8080/chapter12/,可以访问,不再要求登录;
  4. 但是访问/authenticated.jsp,则会跳转登录页面重新进行身份验证。

自定义RememberMe

  • 如果要自己做RememberMe,需要在登录之前这样创建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被窃取;与以上方法不会同时为true。

总结

  • RememberMe需要配合相应的拦截器使用,用错了拦截器可能就不满足你的需求了。
  • 代码示例:ideaProjects/shirochapter12
  • 《跟我学Shiro》第十三章