Spring Security設置自動登錄和顯示當前認證用戶名


當用戶勾選了自動登錄,在有效時間內,即使用戶關閉了瀏覽器,下次打開也會處於登錄狀態(前提是沒有清空瀏覽器cookie)

  

使用Spring Security實現步驟:

  1.在登錄頁面提供一個選框供用戶選擇,name的值必須為:remember-me,否則得在remember me過濾器中指定和它對應的名稱,value的值必須為:true | on | yes | 1

  <div class="checkbox icheck">
  <label><input type="checkbox" name="remember-me" value="true"> 記住 下次自動登錄</label>
  </div>

 2.開啟remember me過濾器
<security:http auto-config="true" use-expressions="true">
        <!--省略其余配置-->
        <!--開啟remember me過濾器,設置token存儲時間,單位為秒-->
        <security:remember-me token-validity-seconds="60"/>
    </security:http>

  3.啟動測試

    

     在瀏覽器可看到cookie已經被保存下來了,有效期為設定的時間,在設定的時間內即使關閉了瀏覽器,重新打開,依然處於登錄狀態

remember me 安全性分析:

  記住我功能能夠提升用戶的體驗,但是安全性卻令人擔憂。因為 Cookie畢竟是保存在客戶端的,很容易盜取,而且cookie的值還與用戶名、密碼這些敏感數據相關,雖然加密了,但是將敏感信息存在客戶端,還是不太安全。在使用此功能的時候,要注意用完網站要及時手動退出登錄,清空認證信息。
  此外,SpringSecurity還提供了remember me的另一種相對更安全的實現機制 :在客戶端的cookie中,僅保存一個無意義的加密串(與用戶名、密碼等敏感數據無關),然后在db中保存該加密串-用戶信息的對應關系,自動登錄時,用cookie中的加密串,到db中驗證,如果通過,自動登錄才算通過。
  實現步驟:

    1.創建一張表,注意這張表的名稱和字段都是固定的,不能修改。

CREATE TABLE `persistent_logins` (
    `username` VARCHAR(64) NOT NULL,
    `series` VARCHAR(64) NOT NULL,
    `token` VARCHAR(64) NOT NULL,
    `last_used` TIMESTAMP NOT NULL,
    PRIMARY KEY (`series`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

    2.然后將spring-security.xml中改為:

<security:http auto-config="true" use-expressions="true">
        <!--
            開啟remember me過濾器,
            data-source-ref="dataSource" 指定數據庫連接池
            token-validity-seconds="60" 設置token存儲時間
            remember-me-parameter="remember-me" 指定記住的參數名 可省略
        -->
        <security:remember-me token-validity-seconds="60"
                                data-source-ref="dataSource"
                                remember-me-parameter="remember-me"/>
    </security:http>

    3.最后測試發現數據庫中自動多了一條記錄:

      選中了記住我功能,表中的數據每登錄一次,記錄就增多一條,只有主動退出登錄,表中的數據才會根據用戶名全部清空

      

 顯示當前認證用戶名

  在jsp頁面顯示:

    在頂部引入標簽

      <%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %>

    在需要顯示的位置使用

      <security:authentication property="principal.username" /> 或者

      <security:authentication property="name" />

  在后台頁面顯示:

@RequestMapping("/findAll")
    public String findAll(Model model){
        List<SysUser> list = userService.findAll();
        model.addAttribute("list", list);

        // 從后台獲取到當前認證通過后的用戶名
        String name = SecurityContextHolder.getContext().getAuthentication().getName();
        System.out.println(name);

        return "user-list";
    }

 


免責聲明!

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



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