在许多网站登录的时候,都会有一个remember me的选项框,勾上就表示这次登录成功,下次访问就可以不登录访问一些页面了,因为在登录成功的时候,服务器生成了remember me 的Cookie,下次浏览器请求网页时,服务器就可以根据Cookie判断用户而不需要登录。

  Shiro使用Remember me功能非常简单。在SecurityManager中配置cookie和cookieManager

/**
 *Cookie
 */
@Bean
public SimpleCookie rememberMeCookie() {
    //这个参数是cookie的名称,对应前端的checkbox的name = rememberMe
    SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
    //如果httyOnly设置为true,则客户端不会暴露给客户端脚本代码,使用HttpOnly cookie有助于减少某些类型的跨站点脚本攻击;
    simpleCookie.setHttpOnly(true);
    //记住我cookie生效时间,单位是秒
    simpleCookie.setMaxAge(600);
    return simpleCookie;
}

/**
 * cookie管理器;
 */
@Bean
public CookieRememberMeManager rememberMeManager() {
    CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
    //rememberme cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位),通过以下代码可以获取
    //KeyGenerator keygen = KeyGenerator.getInstance("AES");
    //SecretKey deskey = keygen.generateKey();
    //System.out.println(Base64.encodeToString(deskey.getEncoded()));
    byte[] cipherKey = Base64.decode("wGiHplamyXlVB11UXWol8g==");
    cookieRememberMeManager.setCipherKey(cipherKey);
    cookieRememberMeManager.setCookie(rememberMeCookie());
    return cookieRememberMeManager;
}
@Bean
public SecurityManager securityManager() {
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    securityManager.setRealm(new MyShiroRealm());
    securityManager.setRememberMeManager(rememberMeManager());
    return securityManager;
}
remenber me 配置

  修改拦截器配置

filterChainDefinitionMap.put("/", "user");
filterChainDefinitionMap.put("/index", "user");

  修改登录页面,加入勾选框

<P><input type="checkbox" name="rememberMe" />记住我</P>

  启动服务器。访问http://localhost:8081 第一次转跳登陆界面,登录成功然后退出浏览器,第二次访问http://localhost:8081 直接进入。Remenber Me 功能实现。如果在对应的Controller方法中加入代码:

  如果在Controller加入判断用户状态的代码可以看到后台打印:false,true和true,false;

@RequestMapping(value = {"/", "/index"}, method = RequestMethod.GET)
public String index() {
    System.out.println(ShiroUtils.getSubject().isRemembered());
    System.out.println(ShiroUtils.getSubject().isAuthenticated());
    return "index";
}

 源码地址:https://github.com/StarkTan/SpringBootShiro

posted on 2018-09-08 11:48  Stark_Tan  阅读(3862)  评论(0编辑  收藏  举报