所謂記住我功能,就是登陸之後,瀏覽器關閉,再次訪問不需要再登陸。記住我功能主要是利用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信息:
後臺控制檯輸出,顯示subject.isRemembered()的結果爲true。
參考文章:
springboot整合shiro-配置記住我(四)