SpringBoot 集成 Shiro:實現Remember me功能(三)


  在許多網站登錄的時候,都會有一個remember me的選項框,勾上就表示這次登錄成功,下次訪問就可以不登錄訪問一些頁面了,因為在登錄成功的時候,服務器生成了remember me 的Cookie,下次瀏覽器請求網頁時,服務器就可以根據Cookie判斷用戶而不需要登錄。

  Shiro使用Remember me功能非常簡單。在SecurityManager中配置cookie和cookieManager

/**
 *Cookie
 */
@Bean
public SimpleCookie rememberMeCookie() {
    //這個參數是cookie的名稱,對應前端的checkbox的name = rememberMe
    SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
    //如果httyOnly設置為true,則客戶端不會暴露給客戶端腳本代碼,使用HttpOnly cookie有助於減少某些類型的跨站點腳本攻擊;
    simpleCookie.setHttpOnly(true);
    //記住我cookie生效時間,單位是秒
    simpleCookie.setMaxAge(600);
    return simpleCookie;
}

/**
 * cookie管理器;
 */
@Bean
public CookieRememberMeManager rememberMeManager() {
    CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
    //rememberme cookie加密的密鑰 建議每個項目都不一樣 默認AES算法 密鑰長度(128 256 512 位),通過以下代碼可以獲取
    //KeyGenerator keygen = KeyGenerator.getInstance("AES");
    //SecretKey deskey = keygen.generateKey();
    //System.out.println(Base64.encodeToString(deskey.getEncoded()));
    byte[] cipherKey = Base64.decode("wGiHplamyXlVB11UXWol8g==");
    cookieRememberMeManager.setCipherKey(cipherKey);
    cookieRememberMeManager.setCookie(rememberMeCookie());
    return cookieRememberMeManager;
}
@Bean
public SecurityManager securityManager() {
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    securityManager.setRealm(new MyShiroRealm());
    securityManager.setRememberMeManager(rememberMeManager());
    return securityManager;
}
remenber me 配置

  修改攔截器配置

filterChainDefinitionMap.put("/", "user");
filterChainDefinitionMap.put("/index", "user");

  修改登錄頁面,加入勾選框

<P><input type="checkbox" name="rememberMe" />記住我</P>

  啟動服務器。訪問http://localhost:8081 第一次轉跳登陸界面,登錄成功然后退出瀏覽器,第二次訪問http://localhost:8081 直接進入。Remenber Me 功能實現。如果在對應的Controller方法中加入代碼:

  如果在Controller加入判斷用戶狀態的代碼可以看到后台打印:false,true和true,false;

@RequestMapping(value = {"/", "/index"}, method = RequestMethod.GET)
public String index() {
    System.out.println(ShiroUtils.getSubject().isRemembered());
    System.out.println(ShiroUtils.getSubject().isAuthenticated());
    return "index";
}

 源碼地址:https://github.com/StarkTan/SpringBootShiro


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM