spring security控制session



spring security控制session
本文給你描述在spring security中如何控制http session。包括session超時、啟用並發session以及其他高級安全配置。

創建session時機
我們可以准確地控制什么時機創建session,有以下選項進行控制:

always – 如果session不存在總是需要創建;
ifRequired – 僅當需要時,創建session(默認配置);
never – 框架從不創建session,但如果已經存在,會使用該session ;
stateless – Spring Security不會創建session,或使用session;

java config配置方式如下:

@Override
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
}


該配置僅控制spring security做什么,不是整個應用,根據配置spring security可能不創建session,但我們的應用可以創建session。理解這點很重要。

缺省值“ifRequired”,spring security根據需要創建session。

對於大多數無狀態應用,“never”選項確保spring security自身不創建任何session;然而,如果應用自己創建session,那么spring security會使用它。

最后,最嚴格session創建選項是“stateless”,其確保應用也不會創建任何session。從spring3.1開始引入,將影響跳過部分spring security過濾器——主要與session相關的,如HttpSessionSecurityContextRepository, SessionManagementFilter, RequestCacheFilter。

這些大多數嚴格控制機制直接暗示cookies不被使用,每個請求需要被認證。無狀態的體系結構與REST api及它們的無狀態約束很好地發揮了作用。在Basic和Digest認證中也可以很好工作。

深入理解
在執行認證過程之前,spring security將運行SecurityContextPersistenceFilter過濾器負責存儲安請求之間的全上下文,上下文根據策略進行存儲,默認為HttpSessionSecurityContextRepository ,其使用http session作為存儲器。

對於嚴格的創建session選項“stateless”,使用另一個存儲策略—— NullSecurityContextRepository,沒有session被創建或使用,用於保存上下文。

並發session控制
當已經認證過的用戶嘗試再次認證時,應用針對該事件有幾種處理方式。可以注銷當前用戶session,使用新的session重新認證,或允許兩個session並存。
啟用並發session控制,首先需要在配置中增加下面監聽器:

@Bean
public HttpSessionEventPublisher httpSessionEventPublisher() {
return new HttpSessionEventPublisher();
}


其本質是確保當session被銷毀時,通知spring security session注冊器。
在這種場景下,允許同一用戶擁有多個並發session,配置如下:

@Override
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement().maximumSessions(2)
}


session超時
session已經超時后,如果用戶使用已經過期的sessionid發送請求,則會被重定向至指定url;同樣如果使用未過期但完全無效的sessionid用戶發送請求,也會被重定向至特定url,配置如下:

http.sessionManagement()
.expiredUrl("/sessionExpired.html")
.invalidSessionUrl("/invalidSession.html");

防止使用url參數進行session跟蹤
在url中暴露session信息會增加安全風險,自spring3.0開始,追加jsessionId至url的重新邏輯可以被禁用,通過設置disable-url-rewriting=”true” 。另外自servlet3.0開始,session跟蹤機制也可以在web.xml中配置:

<session-config>
<tracking-mode>COOKIE</tracking-mode>
</session-config>

javaConfig方式配置如下:

servletContext.setSessionTrackingModes(EnumSet.of(SessionTrackingMode.COOKIE));

配置可以設置jessionId存儲位置:cookie或url參數。

spring security防止篡改session
框架提供了保護典型的session篡改攻擊,當用戶嘗試再次認證時,已經存在的session可以配置實現以不同方式處理。配置方式如下:

http.sessionManagement()
.sessionFixation().migrateSession()

缺省情況,spring security啟用migrateSession,即認證時,創建一個新http session,原session失效,屬性從原session中拷貝過來。

如果不期望這種行為,還有其他兩個選項:

“none”,原session保持有效;
“newSession”,新創建session,且不從原session中拷貝任何屬性。
使用session
session范圍bean
bean可以簡單地通過@Scope在web上下文中定義session范圍:

@Component
@Scope("session")
public class Foo { .. }

然后,可以再注入值另一個bean:

@Autowired
private Foo theFoo;

這時,spring會在http session范圍內創建一個新的bean。

在Controller中注入原生session
原生的session可以被直接注入至Controller方法:

@RequestMapping(..)
public void fooMethod(HttpSession session) {
session.addAttribute(Constants.FOO, new Foo();
//...
Foo foo = (Foo) session.getAttribute(Constants.Foo);
}


獲取原生session
也可以通過調用servlet api以編程方式獲取當前http session:

ServletRequestAttributes attr = (ServletRequestAttributes)
RequestContextHolder.currentRequestAttributes();
HttpSession session= attr.getRequest().getSession(true); // true == allow create

總結
本文討論了spring security如何管理session,以及如何使用session。
————————————————
版權聲明:本文為CSDN博主「neweastsun」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/neweastsun/article/details/79371175


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM