spring security之會話管理

2021-10-01 05:18:40 字數 2879 閱讀 3495

會話固定攻擊(session fixation attack)是利用應用系統在伺服器的會話id固定不變機制,借助他人用相同的會話id獲取認證和授權,然後利用該會話id劫持他人的會話以成功冒充他人,造成會話固定攻擊。

整個攻擊流程是:

防禦固定攻擊非常簡單只需要在使用者登入之後重新生成新的session就行。

在spring security中,使用sessionmanagement(會話管理的配置器)來防禦會話固定攻擊,其防禦策略有四種

)首先要實現invalidsessionstrategy介面

public

class

myinvalidsessionstrategy

implements

invalidsessionstrategy

}

在httpsecurity中進行配置

);預設情況下,一般session的過期時間為一分鐘,可以自定義:

# 單位是s(秒)

server.session.timeout=

60

如果設定小於1分鐘,那麼也會被修正為1分鐘

.

sessionmanagement()

.maximumsessions(2

);

如果沒有特殊配置,新的會話會將舊的會話踢掉如果是需要達到最大數量時,不建立新的會話而不是踢掉舊的會話時,需要如下配置

.

sessionmanagement()

.maximumsession(2

).maxsessionspreventslogin

(true

);

但是上述配置還不過,因為spring security是通過監聽session銷毀事件來觸發會話資訊相關清理工作的,但是如果我們嘗試將舊的會話登出,此時spring security還是會提示會話數量超過了最大設定的併發數量,除非重啟服務,所以我們需要註冊相關的***來使spring security能夠感知到這種變化

如果我們使用之前說過的資料庫來管理使用者的方式:

這樣配置後發現會話併發控制不起作用,原因:

spring security使用會話資訊表來管理使用者的會話狀態,具體實現見sessionregistryimpl類

// 存放使用者以及其所有的sessionid的set

private

final concurrentmap

> principals;

// 存放sessionid以及其對應的sessioninformation

private

final map

sessionids;

principals中:

sessionids中:

可以看出,principals的設計是以userdetails來作為key的,一般來說,如果使用map這種資料結構,如果key是物件的話,一般要重寫這個物件的equals和hashcode方法,否則hashmap不會去重(缺省會以物件的引用位址去計算hashcode),然而我們在實現userdetails的時候並沒有去重寫這兩個方法,所以導致:

所以導致每次登入都會放入乙個新的userdetails,而登出的時候不能夠有效的移除

一般會在集群設定乙個**伺服器作負載均衡(nginx)

如果使用者的登入請求被路由到tomcat1,但是此時tomcat2和3並不知情,在下一次登入如果路由到了tomcat2或者3上,就會發生重複登入的問題

解決方案:

SpringSecurity之自動登入

在spring security中加入自動登入功能 使用這種方案的前提是已經實現了乙個userdetailsservice 前面章節有實現 重啟服務後訪問login頁面會多出乙個remember me的多選框,勾選後登入檢視瀏覽器的cookie會多出乙個 name value remember me...

Spring Security系列之記住我 十二

有這樣乙個場景 有個使用者初訪並登入了你的 然而第二天他又來了,卻必須再次登入。於是就有了 記住我 這樣的功能來方便使用者使用,然而有一件不言自明的事情,那就是這種認證狀態的 曠日持久 早已超出了使用者原本所需要的使用範圍。這意味著,他們可以關閉瀏覽器,然後再關閉電腦,下週或者下個月,乃至更久以後再...

二 Spring Security之密碼加密

override protected void configure authenticationmanagerbuilder auth throws exception 密碼加密,必須為 bean 否則報錯 作用 例項化密碼加密規則,該規則首先會校驗資料庫中儲存的密碼是否符合其規則 經過 bcryp...