SpringSecurity-10-Session會(huì)話管理
理解Session
Http協(xié)議是一種無狀態(tài)協(xié)議所以當(dāng)服務(wù)端需要記錄用戶的狀態(tài)時(shí),需要某種機(jī)制用于識(shí)別用戶狰右,這個(gè)機(jī)制就是Session诡宗。服務(wù)器通過和用戶約定每一個(gè)請(qǐng)求攜帶一個(gè)id信息怀挠,用于統(tǒng)一用戶的請(qǐng)求有了管理,并且區(qū)分不同用戶∩屏基于session方案妹萨,為讓用戶請(qǐng)求都攜帶同一個(gè)id,并且不妨礙用戶體驗(yàn)的情況下年枕,選擇cookie作為載體是一個(gè)不錯(cuò)的選擇,用戶第一次訪問服務(wù)器的時(shí)候乎完,沒有攜帶id,服務(wù)器端會(huì)生成sessionid:session鍵值對(duì)熏兄,并且發(fā)送sessionid給客戶端添加到cookie中。然后該用戶在之后的訪問中树姨,每一次請(qǐng)求都會(huì)將sessionid放到cookie中摩桶,使得服務(wù)端可以很容易識(shí)別用戶。
但是有時(shí)候用戶為了保護(hù)個(gè)人信息或者安全考慮會(huì)禁用cookie,這時(shí)候cookie就無法使用帽揪。因此有時(shí)候服務(wù)還支持用url重寫來實(shí)現(xiàn)硝清,比如:
http://www.baidu.com;jessionid=xxx
URL重寫原本是為了兼容禁用cookie的瀏覽器而設(shè)計(jì)的,但也容易被黑客利用转晰。黑客只需訪問一 次系統(tǒng)芦拿,將系統(tǒng)生成的sessionId提取并拼湊在URL上,然后將該URL發(fā)給一些取得信任的用戶查邢。只要 用戶在session有效期內(nèi)通過此URL進(jìn)行登錄蔗崎,該sessionId就會(huì)綁定到用戶的身份,黑客便可以輕松享 有同樣的會(huì)話狀態(tài)扰藕,完全不需要用戶名和密碼缓苛,這就是典型的會(huì)話固定攻擊。
防御會(huì)話固定攻擊
sessionManagement是一個(gè)會(huì)話管理的配置器邓深,其中未桥,防御會(huì)話固定攻擊的策略有四種:
- none:用戶登錄后session不發(fā)生變化
- newSession:用戶登錄以后創(chuàng)建新的session
- migrateSession:用戶登錄后創(chuàng)建新的session,但是會(huì)將舊的session中數(shù)據(jù)復(fù)制到新的session中。
- changeSessionId:不創(chuàng)建新的會(huì)話芥备,而是使用selert容器提供的會(huì)話固定保護(hù)冬耿,每次登錄訪問之后都更換sessionid,但是沒有新建session會(huì)話门躯。默認(rèn)啟動(dòng)此策略
?http.sessionManagement().sessionFixation().changeSessionId();
會(huì)話過期
除了防御會(huì)話固定攻擊淆党,還可以通過SpringSecurity配置會(huì)話過期策略,比如會(huì)話過期跳轉(zhuǎn)到某個(gè)URL讶凉。在Springboot應(yīng)用中有兩種會(huì)話超時(shí)設(shè)置的方式染乌,當(dāng)會(huì)話超時(shí)之后用戶需要重寫登錄才可以訪問應(yīng)用:
server.servlet.session.timeout=1m
spring.session.timeout=1m
方式1是springboot應(yīng)用自帶的session超時(shí)設(shè)置,方式2是使用Spring Session之后懂讯。提供的session超時(shí)配置荷憋,方式2優(yōu)先級(jí)高。
在Spring Boot中Session超時(shí)最短的時(shí)間是一分鐘褐望,當(dāng)你的設(shè)置小于一分鐘的時(shí)候勒庄,默認(rèn)為一分鐘默認(rèn)超時(shí)時(shí)長是30分鐘
默認(rèn)情況下session失效以后會(huì)跳轉(zhuǎn)到認(rèn)證頁面串前,我們可以自定義session失效后,響應(yīng)結(jié)果实蔽,有以下兩種方式荡碾。
invalidSessionUrl
invalidSessionUrl作用是session失效后跳轉(zhuǎn)的url,配置如下局装,在安全配置中心的 configure(HttpSecurity http)方法中添加代碼如下:
- 在src\main\resources\templates路徑下添加invalidSession.html
<!--suppress?ALL-->
<!DOCTYPE?html>
<html?xmlns:th="http://www.thymeleaf.org"?lang="en">
<head>
????<meta?charset="utf-8">
????<meta?http-equiv="X-UA-Compatible"?content="IE=edge">
????<title>springboot葵花寶典登錄頁面</title>
????<!--?Tell?the?browser?to?be?responsive?to?screen?width?-->
????<meta?name="viewport"?content="width=device-width,?initial-scale=1">
</head>
<body>
<h1>springboot葵花寶典登錄頁面</h1>
<h2>session會(huì)話失效</h2>
</body>
</html>
- 在controller中添加
????@RequestMapping("/invalidSession")
????public?String?invalidSession()?{
????????return?"invalidSession";?//?classpath:?/templates/login.html
????}
- 在LearnSrpingSecurity的configure(HttpSecurity http)添加配置
http.sessionManagement().invalidSessionUrl("/invalidSession")
具體配置如圖
注意要以上路徑需要配置permitAll()權(quán)限坛吁,即無需授權(quán)即可訪問
測試
啟動(dòng)項(xiàng)目登錄后,再次登錄铐尚,結(jié)果如下
invalidSessionStrategy
session失敗后的策略拨脉,配置如下:
- 創(chuàng)建com.security.learn.sessionStrategy.CustomInvalidSessionStrategy代碼如下
public?class?CustomInvalidSessionStrategy?implements?InvalidSessionStrategy?{
????private??static?ObjectMapper?objectMapper?=?new?ObjectMapper();
????@Override
????public?void?onInvalidSessionDetected(HttpServletRequest?request,?HttpServletResponse?response)?throws?IOException,?ServletException?{
????????Cookie?cookie?=?new?Cookie("JSESSIONID",?null);
????????cookie.setMaxAge(0);
????????String?contextPath?=?request.getContextPath();
????????String?c=?contextPath.length()?>?0???contextPath?:?"/";
????????cookie.setPath(c);
????????response.addCookie(cookie);
????????//?當(dāng)認(rèn)證失敗后,響應(yīng)?JSON?數(shù)據(jù)給前端
????????response.setContentType("application/json;charset=UTF-8");
????????response.getWriter().write(objectMapper.writeValueAsString("策略失效"));
????}
}
- 將CustomInvalidSessionStrategy注入容器
@Configuration
public?class?Myconfig?{
????@Bean
????@ConditionalOnMissingBean(InvalidSessionStrategy.class)
????public?CustomInvalidSessionStrategy?customInvalidSessionStrategy(){
????????return??new?CustomInvalidSessionStrategy();
????}
}
- 添加session失效處理
在LearnSrpingSecurity的configure(HttpSecurity http)添加配置宣增,代碼如下
測試
啟動(dòng)項(xiàng)目登錄后玫膀,再次登錄,結(jié)果如下
如果您覺得本文不錯(cuò)爹脾,歡迎關(guān)注,點(diǎn)贊,收藏支持帖旨,您的關(guān)注是我堅(jiān)持的動(dòng)力!
原創(chuàng)不易,轉(zhuǎn)載請(qǐng)注明出處烹吵,感謝支持碉熄!如果本文對(duì)您有用,歡迎轉(zhuǎn)發(fā)分享肋拔!