當用戶勾選了自動登錄,在有效時間內,即使用戶關閉了瀏覽器,下次打開也會處於登錄狀態(前提是沒有清空瀏覽器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"; }