天天看點

SpringSecurity學習之路11-實作記住我的功能

目的:使用者勾選記住我之後,一段時間内免登陸。

{都是接着之前的代碼,一點點加、重構代碼的,不會在這裡詳細叙述之前提到的東西,以後的篇幅也是這樣}

下圖是關于SpringSecurity的原理介紹:

SpringSecurity學習之路11-實作記住我的功能

當登入成功之後,RememberService會将Token存儲進浏覽器Cookie,再将它寫入進資料庫裡。當再次進行登入操作時,便會拿着浏覽器中的token去資料庫中查找,查找成功之後便會調用UserDetailsService。

首先需要在原先的登入頁面中加一個checkbox

SpringSecurity學習之路11-實作記住我的功能

 注意,name的值必須叫這個。

因為是将token資訊存儲進了資料庫,是以還需要進行下資料庫配置,配置資訊寫在application.Properties中。

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/imooc-demo?useUnicode=yes&characterEncoding=utf8
spring.datasource.username=name
spring.datasource.password=password
           

然後将資料源以及UserDetailsService注入進來

SpringSecurity學習之路11-實作記住我的功能

接下來要做的事情就是在BrowserSecurityConfig類(繼承了WebSecurityConfigurerAdapter)中建立persistentTokenRepository()方法(方法名無要求),其傳回類型為PersistentTokenRepository。

SpringSecurity學習之路11-實作記住我的功能

 紅色标注的代碼作用是,啟動時自動建立存儲token的表{點進這個方法裡提供有SQL語句,可以手動建立}。

最後就是在configure()方法中将remember配置進去,代碼如下:

SpringSecurity學習之路11-實作記住我的功能

至此,關于rememberMe的配置就結束了,原理圖看着挺多的,配置起來就這幾步。

下面通過debug的方式,實際感受下rememberMe的工作流程。(結合最上面的rememberMe原理圖)

首先,清除原有token、cookie資料,在位址欄通路/user,會進入到登入頁面,輸入正确的資訊之後點選登入,會進入到UsernamePasswordAuthenticationFilter類中:

SpringSecurity學習之路11-實作記住我的功能

判斷請求是不是以post方式送出的,然後擷取到使用者名和密碼資訊,并生成token

SpringSecurity學習之路11-實作記住我的功能

在判斷登入成功之後,會進入到以下方法中去

SpringSecurity學習之路11-實作記住我的功能

 這個就是登入成功之後所進入到的方法,第一個紅框部分意思是将登入成功的使用者資訊,包括權限資訊等存儲進session。第二個紅框部分就是調用rememberServices方法,往下執行

SpringSecurity學習之路11-實作記住我的功能

 建立一個新的token,存儲進資料庫。向浏覽器傳回cookie資訊。至此,流程結束。現在資料庫表中已經有了一條資訊。

SpringSecurity學習之路11-實作記住我的功能

接下來我們重新開機服務,重新開機浏覽器,直接通路/user,看看流程是咋走的。

SpringSecurity學習之路11-實作記住我的功能

判斷session裡是否有使用者權限資訊,即該請求是否通過了UsernamePasswordAuthenticationFilter或BasicAuthenticationFilter的驗證,如果沒有通過驗證, 則調用rememberServices的autoLogin方法。接着往下走,

SpringSecurity學習之路11-實作記住我的功能

根據Series擷取Token資訊,然後根據查詢到的token資訊裡的使用者名,使用UserDetailsService來做使用者登入

SpringSecurity學習之路11-實作記住我的功能

往下走,如果獲得了使用者資訊則表明登入成功,并将其存儲進session,結束。

SpringSecurity學習之路11-實作記住我的功能

 至此,rememberMe功能介紹完畢。