SpringSecurity-10-Session會(huì)話管理

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)用:

  1. server.servlet.session.timeout=1m

  2. 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)方法中添加代碼如下:

  1. 在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>
  1. 在controller中添加
????@RequestMapping("/invalidSession")
????public?String?invalidSession()?{
????????return?"invalidSession";?//?classpath:?/templates/login.html
????}
  1. 在LearnSrpingSecurity的configure(HttpSecurity http)添加配置
http.sessionManagement().invalidSessionUrl("/invalidSession")

具體配置如圖

注意要以上路徑需要配置permitAll()權(quán)限坛吁,即無需授權(quán)即可訪問

測試

啟動(dòng)項(xiàng)目登錄后,再次登錄铐尚,結(jié)果如下

invalidSessionStrategy

session失敗后的策略拨脉,配置如下:

  1. 創(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("策略失效"));
????}
}
  1. 將CustomInvalidSessionStrategy注入容器
@Configuration
public?class?Myconfig?{
????@Bean
????@ConditionalOnMissingBean(InvalidSessionStrategy.class)
????public?CustomInvalidSessionStrategy?customInvalidSessionStrategy(){

????????return??new?CustomInvalidSessionStrategy();
????}
}
  1. 添加session失效處理

在LearnSrpingSecurity的configure(HttpSecurity http)添加配置宣增,代碼如下

測試

啟動(dòng)項(xiàng)目登錄后玫膀,再次登錄,結(jié)果如下

如果您覺得本文不錯(cuò)爹脾,歡迎關(guān)注,點(diǎn)贊,收藏支持帖旨,您的關(guān)注是我堅(jiān)持的動(dòng)力!


公眾號(hào) springboot葵花寶典
主要分享JAVA技術(shù)誉简,主要包含SpringBoot碉就、SpingCloud、Docker闷串、中間件等技術(shù)瓮钥,

原創(chuàng)不易,轉(zhuǎn)載請(qǐng)注明出處烹吵,感謝支持碉熄!如果本文對(duì)您有用,歡迎轉(zhuǎn)發(fā)分享肋拔!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锈津,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子凉蜂,更是在濱河造成了極大的恐慌琼梆,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窿吩,死亡現(xiàn)場離奇詭異茎杂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)纫雁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門煌往,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人轧邪,你說我怎么就攤上這事刽脖⌒吆#” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵曲管,是天一觀的道長却邓。 經(jīng)常有香客問我,道長翘地,這世上最難降的妖魔是什么申尤? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任癌幕,我火速辦了婚禮衙耕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘勺远。我一直安慰自己橙喘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布胶逢。 她就那樣靜靜地躺著厅瞎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪初坠。 梳的紋絲不亂的頭發(fā)上和簸,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音碟刺,去河邊找鬼锁保。 笑死,一個(gè)胖子當(dāng)著我的面吹牛半沽,可吹牛的內(nèi)容都是我干的爽柒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼者填,長吁一口氣:“原來是場噩夢啊……” “哼浩村!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起占哟,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤心墅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后榨乎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怎燥,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年谬哀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刺覆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡史煎,死狀恐怖谦屑,靈堂內(nèi)的尸體忽然破棺而出驳糯,到底是詐尸還是另有隱情,我是刑警寧澤氢橙,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布酝枢,位于F島的核電站,受9級(jí)特大地震影響悍手,放射性物質(zhì)發(fā)生泄漏帘睦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一坦康、第九天 我趴在偏房一處隱蔽的房頂上張望竣付。 院中可真熱鬧,春花似錦滞欠、人聲如沸古胆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逸绎。三九已至,卻和暖如春夭谤,著一層夾襖步出監(jiān)牢的瞬間棺牧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國打工朗儒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颊乘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓采蚀,卻偏偏與公主長得像疲牵,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子榆鼠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容