Shiro功能應用(二)--記住我功能實現


     所謂記住我功能,就是登陸之後,瀏覽器關閉,再次訪問不需要再登陸。記住我功能主要是利用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-配置記住我(四)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章