shiro学习笔记(9) -- shiro 记住密码

本文详细介绍了如何在Shiro框架中配置记住密码功能,包括自定义记住我cookie、设置rememberMe参数、配置rememberMeManager及CipherKey加密密钥,以及在DefaultWebSecurityManager中整合rememberMeManager。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

9. shiro学习笔记(9) – shiro 记住密码

  1. 在shiroConfig中配置记住我cookie

    /**
     * cookie对象;会话Cookie模板 ,默认为: JSESSIONID 问题: 与SERVLET容器名冲突,重新定义为sid或rememberMe,自定义
     * @return
     */
    @Bean
    public SimpleCookie rememberMeCookie(){
        //这个参数是cookie的名称,对应前端的checkbox的name = rememberMe
        SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
        //setcookie的httponly属性如果设为true的话,会增加对xss防护的安全系数。它有以下特点:
    
        //setcookie()的第七个参数
        //设为true后,只能通过http访问,javascript无法访问
        //防止xss读取cookie
        simpleCookie.setHttpOnly(true);
        simpleCookie.setPath("/");
        //<!-- 记住我cookie生效时间30天 ,单位秒;-->
        simpleCookie.setMaxAge(2592000);
        return simpleCookie;
    }
    
  2. cookie管理对象;记住我功能,rememberMe管理器

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

    /**
     * FormAuthenticationFilter 过滤器 过滤记住我
     * @return
     */
    @Bean
    public FormAuthenticationFilter formAuthenticationFilter(){
        FormAuthenticationFilter formAuthenticationFilter = new FormAuthenticationFilter();
        //对应前端的checkbox的name = rememberMe
        formAuthenticationFilter.setRememberMeParam("rememberMe");
        return formAuthenticationFilter;
    }
    
  4. 在DefaultWebSecurityManager中添加rememberMeManager

    /**
    * 安全管理器
    * 注:使用shiro-spring-boot-starter 1.4时,返回类型是SecurityManager会报错,直接引用shiro-spring则不报错
    *
    * @return
    */
    @Bean
    public DefaultWebSecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(userRealm());
    
        //配置记住我
        securityManager.setRememberMeManager(rememberMeManager());
    
        return securityManager;
    }
    修改shirFilter中拦截请求的规则,/**从authc 改为user
    
  5. 修改shirFilter中拦截请求的规则,将/**从authc 改为user

    filterChainDefinitionMap.put("/favicon.ico", "anon");
    // 改下面这一行
    filterChainDefinitionMap.put("/**", "user");
    
    shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
    
  6. 在登录时设置

    @RequestMapping("/login")
    public Object login(String username, String password, HttpSession session)
    {
        Subject user = SecurityUtils.getSubject();
        // 记住我:后面有个参数,true表示记住密码
        UsernamePasswordToken token = new UsernamePasswordToken(username, password, true);
        try
        {
            user.login(token);
    
            // 记住我:将用户信息添加到session中
            session.setAttribute("user", user.getPrincipal());
            return "redirect:/index";
        } catch (UnknownAccountException e)
        {
            System.out.println("message" + "账号不存在!");
        } catch (DisabledAccountException e)
        {
            System.out.println("message" + "账号未启用!");
        } catch (IncorrectCredentialsException e)
        {
            System.out.println("message" + "密码错误!");
        } catch (Throwable e)
        {
            System.out.println("message" + "未知错误!");
        }
        return "login";
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值