Shiro中的记住我

       前言

        Shiro中使用记住我功能,可以使用户在下次登录时无需输入账号密码。例如支付宝、微信、QQ类似。


RememberMeManager

        RememberMeManager。使用记住我的一个主要接口。

upload successful

        记住我(RememberMe)的实现主要是通过用户登录勾选记住我、通过RememberMeManager接口中的步骤将Cookie保存在本地客户端。在下次运行时通过扫描到对应的Cookie进行自动登录。


实现记住我的几个步骤
  • 配置文件中创建SimpleCookie的生命周期Bean

    @Bean
    public SimpleCookie rememberMeCookie(){
        SimpleCookie simpleCookie =new SimpleCookie("rememberMe");
        simpleCookie.setMaxAge(259200);
        return simpleCookie;
    }
  • 创建RememberMeManager写入Cookie和Cookie加密

    @Bean
    public RememberMeManager cookieRememberMeManager(){
        CookieRememberMeManager cookie = new CookieRememberMeManager();
        cookie.setCookie(rememberMeCookie());
        //Cookie加密
        cookie.setCipherKey(Base64.decode("2AvVhdsgUs0FSA3SDFAdag=="));
        return cookie;
    }

使用import org.apache.shiro.codec.Base64;的加密方式。如果使用了其他包中的加密方式可能导致没有Cookie加密的Key。发生java.lang.IllegalArgumentException: key argument cannot be null or empty.异常。

cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)。秘钥不对也可能导致Unable to init cipher instance.异常 - 无法初始化密码实例。

  • 将RememberMeManager方法写入到安全管理器

    @Bean
    public SecurityManager securityManager(){
        DefaultSecurityManager manager = new DefaultWebSecurityManager();
        manager.setRealm(myRealm());                         manager.setRememberMeManager(cookieRememberMeManager());
        return manager;
    }