本系列博文目录:http://www.javashuo.com/article/p-ewndobct-kn.htmljava
Shiro提供了记住我(RememberMe)的功能,关闭了浏览器下次再打开时仍是能记住你是谁,下次访问时无需再登陆便可访问。spring
spring boot配置浏览器
/** * 建立保存记住我信息的Cookie */ @Bean(name = "rememberMeCookie") public SimpleCookie getSimpleCookie() { SimpleCookie simpleCookie = new SimpleCookie(); simpleCookie.setName("rememberMe");//cookie名字 simpleCookie.setHttpOnly(true); //设置cookieHttpOnly,保证cookie安全 simpleCookie.setMaxAge(604800); //保存7天 单位秒 return simpleCookie; } /** * 建立记住我管理器 */ @Bean(name = "rememberMeManager") public CookieRememberMeManager getCookieRememberMeManager(SimpleCookie rememberMeCookie) { CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager(); byte[] cipherKey = Base64.decode("wGiHplamyXlVB11UXWol8g==");//建立cookie秘钥 cookieRememberMeManager.setCipherKey(cipherKey); //存入cookie秘钥 cookieRememberMeManager.setCookie(rememberMeCookie); //存入记住我Cookie return cookieRememberMeManager; } /** * 建立默认的安全管理类 * 整个安全认证流程的管理都由此类负责 */ @Bean(name = "securityManager") public DefaultWebSecurityManager securityManager(ShiroRealm shiroRealm,EhCacheManager shiroCacheManager,CookieRememberMeManager rememberMeManager) { DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager(); //建立安全管理类 ...... defaultWebSecurityManager.setRememberMeManager(rememberMeManager);//配置记住我cookie管理类 return defaultWebSecurityManager; }
authc拦截器负责拦截须要登陆认证的路径,可是记住我不可以被识别经过。安全
user拦截器内部会执行authc拦截器,登陆认证完成和记住我均可以经过。cookie
因此若是不使用“记住我”功能就配置authc拦截器,若是使用记住我就配置user拦截器。ide
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>(); filterChainDefinitionMap.put("/", "anon"); //无需登陆认证和受权就可访问的路径使用anon拦截器 filterChainDefinitionMap.put("/home/**", "user");//须要登陆认证的路径使用authc或user拦截器 filterChainDefinitionMap.put("/user/**", "user,perms[user]");//须要权限受权的路径使用perms拦截器 filterChainDefinitionMap.put("/admin/**", "user,perms[admin]");//authc和perms拦截器可同时使用 shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);//设置拦截规则
是否记住我rememberMe标识须要在登陆拦截器中获取而且存入tokenspa
页面提交表单的记住我元素name值必须是“rememberMe”.net
/** * 建立Token */ @Override protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) { String username = getUsername(request);//获取用户名 表单name:username String password = getPassword(request);//获取密码 表单name:password boolean rememberMe = isRememberMe(request);//获取是否记住我 表单name:rememberMe String captchaId = WebUtils.getCleanParam(request, "captchaId");//获取验证码id String captcha = WebUtils.getCleanParam(request, "captcha");//获取用户输入的验证码字符 return new CaptchaAuthenticationToken(username, password,captchaId, captcha, rememberMe);//存入本身定义的包含验证码的Token }