在上一章:springsecurity入門案例 中,實現了入門程式, 這章為該程式加上自動登入的功能。
三、執行程式
在登陸頁新增自動登入的選項,注意自動登入欄位的 name 必須是remember-me
:
lang
="en"
>
>
charset
="utf-8"
>
>
titletitle
>
head
>
>
>
登入h1
>
2.1 cookie儲存
這種方式十分簡單,只要在websecurityconfig
中的configure()
方法新增乙個rememberme()
即可,如下所示:
當我們登陸時勾選自動登入時,會自動在 cookie 中儲存乙個名為remember-me
的cookie,預設有效期為2周,其值是乙個加密字串:
2.2 資料庫儲存
使用 cookie 儲存雖然很方便,但是大家都知道 cookie 畢竟是儲存在客戶端的,而且 cookie 的值還與使用者名稱、密碼這些敏感資料相關,雖然加密了,但是將敏感資訊存在客戶端,畢竟不太安全。
spring security 還提供了另一種相對更安全的實現機制:在客戶端的 cookie 中,僅儲存乙個無意義的加密串(與使用者名稱、密碼等敏感資料無關),然後在資料庫中儲存該加密串-使用者資訊的對應關係,自動登入時,用 cookie 中的加密串,到資料庫中驗證,如果通過,自動登入才算通過。
2.2.1 基本原理
當瀏覽器發起表單登入請求時,當通過usernamepasswordauthenticationfilter
認證成功後,會經過remembermeservice
,在其中有個tokenrepository
,它會生成乙個 token,首先將 token 寫入到瀏覽器的 cookie 中,然後將 token、認證成功的使用者名稱寫入到資料庫中。
當瀏覽器下次請求時,會經過remembermeauthenticationfilter
,它會讀取 cookie 中的 token,交給remembermeservice
從資料庫中查詢記錄。如果存在記錄,會讀取使用者名稱並去呼叫userdetailsservice
,獲取使用者資訊,並將使用者資訊放入spring security 中,實現自動登陸。
remembermeauthenticationfilter 在整個過濾器鏈中是比較靠後的位置,也就是說在傳統登入方式都無法登入的情況下才會使用自動登陸。
2.2.2 **實現
首先需要建立一張表來儲存 token 資訊:
create
table
`persistent_logins`
(`username`
varchar(64
)not
null
,`series`
varchar(64
)not
null
,`token`
varchar(64
)not
null
,`last_used`
timestamp
notnull
default
current_timestamp
onupdate
current_timestamp
,primary
key(
`series`))
engine
=innodb
default
charset
=utf8;
在 websecurityconfig 中注入datasource
,建立乙個persistenttokenrepository
的bean:
@autowired
private datasource datasource;
@bean
public persistenttokenrepository persistenttokenrepository()
在config()
中按如下所示配置自動登陸:
勾選自動登入後,cookie 和資料庫中均儲存了 token 資訊:
spring security 安全框架
本文 http itblood.com spring security security framework.html 安全常識 acegi介紹 以宣告式方式為基於spring的web應用新增認證和授權控制 acegi體系結構 認證管理器 訪問控制管理器。認證 authenticationproce...
SpringSecurity認證流程
在之前的文章 springboot spring security 基本使用及個性化登入配置 中對springsecurity進行了簡單的使用介紹,基本上都是對於介面的介紹以及功能的實現。這一篇文章嘗試從原始碼的角度來上對使用者認證流程做乙個簡單的分析。在具體分析之前,我們可以先看看springse...
SpringSecurity使用技巧
1 鑑權處理頁通常包括四個方面的設定,分別是鑑權失敗 鑑權成功 未鑑權訪問 已鑑權但訪問了受保護許可權。如何自 定義這四類處理。鑑權失敗的預設處理頁面是 spring security login?login error 其預設處理類為 urlauthenticationfailurehandler...