本系列博文目錄: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 }