Spring Security系列之記住我 十二

2021-09-11 13:07:58 字數 3234 閱讀 7520

有這樣乙個場景——有個使用者初訪並登入了你的**,然而第二天他又來了,卻必須再次登入。於是就有了「記住我」這樣的功能來方便使用者使用,然而有一件不言自明的事情,那就是這種認證狀態的」曠日持久「早已超出了使用者原本所需要的使用範圍。這意味著,他們可以關閉瀏覽器,然後再關閉電腦,下週或者下個月,乃至更久以後再回來,只要這間隔時間不要太離譜,該**總會知道誰是誰,並一如既往的為他們提供所有相同的功能和服務——與許久前他們離開的時候別無二致。

使用者認證成功之後呼叫remebermeservice根據使用者名稱名生成tokentokenrepository寫入到資料庫,同時也將token寫入到瀏覽器的cookie

重啟服務之後,使用者再次登入系統會由remembermeauthenticationfilter攔截,從cookie中讀取token資訊,與persistent_logins表匹配判斷是否使用記住我功能。最中由userdetailsservice查詢使用者資訊

建立persistent_logins表

create table persistent_logins (username varchar(64) not null, series varchar(64) primary key, token varchar(64) not null, last_used timestamp not null);

複製**

登陸頁面新增記住我複選款(name必須是remeber-me)
"remember-me"

type="checkbox"> 下次自動登入

複製**

配置merryyousecurityconfig
http.

......

.and()

.rememberme()

.tokenrepository(persistenttokenrepository())//設定操作表的repository

.tokenvalidityseconds(securityproperties.getremembermeseconds())//設定記住我的時間

.userdetailsservice(userdetailsservice)//設定userdetailsservice

.and()

......

複製**

//# 1.將已認證過的authentication放入到securitycontext中

securitycontextholder.getcontext().setauthentication(authresult);

//# 2.登入成功呼叫remembermeservices

remembermeservices.loginsuccess(request, response, authresult);

// fire event

if (this.eventpublisher != null)

successhandler.onauthenticationsuccess(request, response, authresult);

}複製**將已認證過的authentication放入到securitycontext中

登入成功呼叫remembermeservices

}複製**判斷是否勾選記住我

}複製**獲取使用者名稱

建立token

儲存都資料庫

寫入到瀏覽器的cookie中

public void dofilter(servletrequest req, servletresponse res, filterchain chain)

throws ioexception, servletexception

logger.debug("remember-me cookie detected");

if (remembermecookie.length() == 0)

userdetails user = null;

try

catch (cookietheftexception cte)

catch (usernamenotfoundexception nouser)

catch (invalidcookieexception invalidcookie)

catch (accountstatu***ception statusinvalid)

catch (remembermeauthenticationexception e)

cancelcookie(request, response);

return null;

}複製**

獲取cookie

解析cookie

獲取使用者憑證

檢查使用者憑證

文章來源

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...