ch13:管理session,顯示活躍用戶(hù)數(shù)

Spring Security的一個(gè)常用配置就是檢測(cè)相同的用戶(hù)以不同的session登錄系統(tǒng)。這稱(chēng)為concurrency control骏啰,是session管理一系列配置的一部分。Spring Security的session管理能夠以?xún)煞N不同的方式進(jìn)行配置——session fixation protection(固化保護(hù))和concurrency control(并發(fā)控制)抽高。

配置session fixation保護(hù)

Session fixation protection是惡意用戶(hù)試圖竊取系統(tǒng)中一個(gè)未認(rèn)證用戶(hù)的session判耕,在用戶(hù)認(rèn)證后,創(chuàng)建session副本翘骂,無(wú)需用戶(hù)名和密碼來(lái)訪(fǎng)問(wèn)用戶(hù)信息的保護(hù)措施壁熄。攻擊流程如圖所示。


Paste_Image.png

該類(lèi)攻擊的主要是利用了用戶(hù)認(rèn)證前后使用相同的session這個(gè)漏洞碳竟,其保護(hù)措施就是在用戶(hù)認(rèn)證后創(chuàng)建一個(gè)新的session草丧,并令舊session失效。
Spring Security默認(rèn)已經(jīng)開(kāi)啟了Session Fixation Protection莹桅。下面的配置等同于默認(rèn)開(kāi)啟設(shè)置

   @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                //Spring Security的默認(rèn)啟用防止固化session攻擊
                .and().sessionManagement().sessionFixation().migrateSession();
    }

sessionFixation可以設(shè)置三種方式:

  1. NONE昌执,不啟用Fixation保護(hù)
  2. migrateSession,啟用Fixation保護(hù)诈泼,用戶(hù)認(rèn)證后創(chuàng)建新的session懂拾,并將舊session的屬性復(fù)制到新session中。
  3. newSession铐达,啟用Fixation保護(hù)岖赋,用戶(hù)認(rèn)證后創(chuàng)建新的session,但是不復(fù)制舊session的屬性瓮孙。

配置session concurrency protection

設(shè)置了session fixation protection唐断,自然會(huì)想到控制session的并發(fā)數(shù)量汁汗。session并發(fā)控制能夠確保一個(gè)用戶(hù)不能同時(shí)擁有超過(guò)一定數(shù)量的活躍session。配置Spring Security的session并發(fā)數(shù)非常簡(jiǎn)單:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/assets/**").permitAll()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/**").hasRole("USER")
                .and().formLogin().loginPage("/login.jsp").permitAll().loginProcessingUrl("/login")
                .and().logout().permitAll()
                //自動(dòng)識(shí)別tokenRepository類(lèi)型栗涂,啟用PersistentTokenBasedRememberMeServices
                .and().rememberMe().tokenRepository(persistentTokenRepository())
                //Spring Security的默認(rèn)啟用防止固化session攻擊
                .and().sessionManagement().sessionFixation().migrateSession()
                //設(shè)置session最大并發(fā)數(shù)為1,當(dāng)建立新session時(shí)祈争,原session將expired斤程,并且跳轉(zhuǎn)到登錄界面
                .maximumSessions(1).expiredUrl("/login.jsp").sessionRegistry(sessionRegistry).and()
                .and().csrf().disable();
    }

這里設(shè)置session并發(fā)數(shù)為1,當(dāng)用戶(hù)在session失效前又創(chuàng)建另一session菩混,則前一個(gè)session失效忿墅,并且再次訪(fǎng)問(wèn)時(shí),自動(dòng)跳轉(zhuǎn)到/loging.jsp沮峡,要求用戶(hù)再次認(rèn)證疚脐。

獲取系統(tǒng)在線(xiàn)用戶(hù)總數(shù)

Spring Security會(huì)將認(rèn)證的用戶(hù)存儲(chǔ)到Session Registry中,通過(guò)該類(lèi)就可以獲取當(dāng)前在線(xiàn)用戶(hù)數(shù)據(jù)邢疙,配置方法同上棍弄。Session Registry依賴(lài)HttpSessionEventPublisher,該類(lèi)注冊(cè)到服務(wù)容器中疟游,就可以監(jiān)聽(tīng)session狀態(tài)的變化呼畸,而調(diào)整Session Registry。
配置HttpSessionEventPublisher:

/**
 * 以war包形式部署到web容器的啟動(dòng)類(lèi)
 */
public class ApplicationServletInitializer extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(ApplicationInitializer.class);
    }

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        super.onStartup(servletContext);
        servletContext.addListener(new HttpSessionEventPublisher());
    }
}

為了獲得當(dāng)前用戶(hù)信息颁虐,還需要配置一個(gè)Spring Registry Bean蛮原,默認(rèn)Spring Security并未提供該類(lèi)型的bean,我們需要明確聲明另绩,并將其配置給sessionManager()儒陨。

  @Bean
    public SessionRegistry sessionRegistry() {
        return new SessionRegistryImpl();
    }

這樣我們就可以將SessionRegistry注入到需要的地方,獲取其提供的在線(xiàn)用戶(hù)信息笋籽。

代碼示例:https://github.com/wexgundam/spring.security/tree/master/ch13

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蹦漠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子干签,更是在濱河造成了極大的恐慌津辩,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件容劳,死亡現(xiàn)場(chǎng)離奇詭異喘沿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)竭贩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)蚜印,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人留量,你說(shuō)我怎么就攤上這事窄赋∮炊” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵忆绰,是天一觀(guān)的道長(zhǎng)浩峡。 經(jīng)常有香客問(wèn)我,道長(zhǎng)错敢,這世上最難降的妖魔是什么翰灾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮稚茅,結(jié)果婚禮上纸淮,老公的妹妹穿的比我還像新娘。我一直安慰自己亚享,他們只是感情好咽块,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著欺税,像睡著了一般侈沪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上魄衅,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天峭竣,我揣著相機(jī)與錄音,去河邊找鬼晃虫。 笑死皆撩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哲银。 我是一名探鬼主播扛吞,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼荆责!你這毒婦竟也來(lái)了滥比?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤做院,失蹤者是張志新(化名)和其女友劉穎盲泛,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體键耕,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寺滚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屈雄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片村视。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖酒奶,靈堂內(nèi)的尸體忽然破棺而出蚁孔,到底是詐尸還是另有隱情奶赔,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布杠氢,位于F島的核電站站刑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鼻百。R本人自食惡果不足惜笛钝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望愕宋。 院中可真熱鬧,春花似錦结榄、人聲如沸中贝。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)邻寿。三九已至,卻和暖如春视哑,著一層夾襖步出監(jiān)牢的瞬間绣否,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工挡毅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蒜撮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓跪呈,卻偏偏與公主長(zhǎng)得像段磨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子耗绿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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