Shiro功能应用(二)--记住我功能实现

文章目录

        • 代码实现:
        • 功能测试:

     所谓记住我功能,就是登陆之后,浏览器关闭,再次访问不需要再登陆。记住我功能主要是利用Cookie来实现的。Shiro提供了记住我(RememberMe)的功能,实现也比较简单
     本文在上一篇文章( Shrio功能应用(一)–登陆验证(源码)以及权限执行过程)代码基础进行添加记住我功能。

代码实现:

      代码地址:
          https://github.com/OooooOz/SpringBoot-Shiro

     前台页面、控制器、成功跳转页面代码都不变
     ShiroConfig的Shiro过滤器:

@Bean
	public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){
     
		ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
		... ... ... ...
        //其他资源都需要认证  authc 表示需要认证才能进行访问 user表示配置记住我或认证通过可以访问的地址
//        perms.put("/*", "authc");
        perms.put("/*", "user");
		... ... ... ...
		return shiroFilterFactoryBean;
	}

     ShiroConfig的安全管理器SecurityManager:

    @Bean(name="securityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("shiroRealm") MyShiroRealm shiroRealm){
     
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(shiroRealm);
        securityManager.setRememberMeManager(rememberMeManager());	    //实现记住我
        return securityManager;
    }

     ShiroConfig的记住我新增配置:

    /**
     * FormAuthenticationFilter 过滤器 过滤记住我
     */
    @Bean
    public FormAuthenticationFilter formAuthenticationFilter(){
     
        FormAuthenticationFilter formAuthenticationFilter = new FormAuthenticationFilter();
        formAuthenticationFilter.setRememberMeParam("rememberMe");	//对应前端的checkbox的name = rememberMe,默认值是rememberMe
        return formAuthenticationFilter;
    }
    
    /**
     * cookie管理对象;记住我功能,rememberMe管理器
     */
    @Bean
    public CookieRememberMeManager rememberMeManager(){
     
        CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
        cookieRememberMeManager.setCookie(rememberMeCookie());
        //rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)
        cookieRememberMeManager.setCipherKey(Base64.decode("4AvVhmFLUs0KTA3Kprsdag=="));
        return cookieRememberMeManager;
    }

    /**
     * cookie对象;会话Cookie模板 ,默认为: JSESSIONID 问题: 与SERVLET容器名冲突,重新定义为sid或rememberMe,自定义
     */
    @Bean
    public SimpleCookie rememberMeCookie(){
     
        //这个参数是cookie的名称,对应前端的checkbox的name = rememberMe
        SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
        simpleCookie.setHttpOnly(true);     //设为true后,只能通过http访问,javascript无法访问,防止xss读取cookie
        simpleCookie.setPath("/");
        simpleCookie.setMaxAge(60);        //记住我cookie生效时间1min ,单位秒,-1 表示浏览器关闭时失效此 Cookie;
        return simpleCookie;
    }

功能测试:

     访问http://localhost:8080/userList.do,跳转登陆页面,登陆成功后,关闭浏览器,再重新访问http://localhost:8080/userList.do,直接跳转到成功的页面,不会重新登陆。60s过后重新打开浏览器访问,有需要重新登陆。
     重新访问时,可以查看浏览器,会记录有Cookie信息:
Shiro功能应用(二)--记住我功能实现_第1张图片
     后台控制台输出,显示subject.isRemembered()的结果为true。
Shiro功能应用(二)--记住我功能实现_第2张图片
     参考文章
     springboot整合shiro-配置记住我(四)

你可能感兴趣的:(Shrio,cookie,java)