9. shiro学习笔记(9) – shiro 记住密码
-
在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; }
-
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; }
-
记住我Filter
/** * FormAuthenticationFilter 过滤器 过滤记住我 * @return */ @Bean public FormAuthenticationFilter formAuthenticationFilter(){ FormAuthenticationFilter formAuthenticationFilter = new FormAuthenticationFilter(); //对应前端的checkbox的name = rememberMe formAuthenticationFilter.setRememberMeParam("rememberMe"); return formAuthenticationFilter; }
-
在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
-
修改shirFilter中拦截请求的规则,将/**从authc 改为user
filterChainDefinitionMap.put("/favicon.ico", "anon"); // 改下面这一行 filterChainDefinitionMap.put("/**", "user"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
-
在登录时设置
@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"; }