成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring Security 實戰(zhàn)干貨:WebSecurity和HttpSecurity的關(guān)系

開發(fā) 前端
前幾天有粉絲私信我:WebSecurity和HttpSecurity啥關(guān)系?當(dāng)時給我問住了,我大概只知道它們之間的關(guān)系類似TypeScript和JavaScript的關(guān)系,但是具體的細(xì)節(jié)確實不太清楚。因此就在周末簡單研究了一下。

[[393896]]

前幾天有粉絲私信我:WebSecurity和HttpSecurity啥關(guān)系?當(dāng)時給我問住了,我大概只知道它們之間的關(guān)系類似TypeScript和JavaScript的關(guān)系,但是具體的細(xì)節(jié)確實不太清楚。因此就在周末簡單研究了一下。

HttpSecurity的本質(zhì)

前幾天在Spring Security 5.4的新玩法中介紹了一種新的配置HttpSecurity的方式:

  1. @Bean 
  2. SecurityFilterChain filterChain(HttpSecurity http) throws Exception { 
  3.     return http 
  4.             .antMatcher("/**"
  5.             .authorizeRequests(authorize -> authorize 
  6.                     .anyRequest().authenticated() 
  7.             ) 
  8.             .build(); 

其實就能夠知道HttpSecurity是用來構(gòu)建包含了一系列過濾器鏈的過濾器SecurityFilterChain,平常我們的配置就是圍繞構(gòu)建SecurityFilterChain進(jìn)行。還得拿出這張老圖:

安全過濾鏈

從上面這個圖中可以看出構(gòu)建好的還要交給FilterChainProxy來代理,是不是有點(diǎn)多此一舉?

WebSecurity的本質(zhì)

在有些情況下這種確實多此一舉, 不過更多時候我們可能需要配置多個SecurityFilterChain來實現(xiàn)對多種訪問控制策略。

多個SecurityFilterChain

為了精細(xì)化的管理多個SecurityFilterChain的生命周期,搞一個統(tǒng)一管理這些SecurityFilterChain的代理就十分必要了,這就是WebSecurity的意義。下面是WebSecurity的build方法的底層邏輯:

  1. @Override 
  2. protected Filter performBuild() throws Exception { 
  3.    Assert.state(!this.securityFilterChainBuilders.isEmpty(), 
  4.          () -> "At least one SecurityBuilder<? extends SecurityFilterChain> needs to be specified. " 
  5.                + "Typically this is done by exposing a SecurityFilterChain bean " 
  6.                + "or by adding a @Configuration that extends WebSecurityConfigurerAdapter. " 
  7.                + "More advanced users can invoke " + WebSecurity.class.getSimpleName() 
  8.                + ".addSecurityFilterChainBuilder directly"); 
  9.     // 被忽略請求的個數(shù) 和 httpscurity的個數(shù) 構(gòu)成了過濾器鏈集合的大小 
  10.    int chainSize = this.ignoredRequests.size() + this.securityFilterChainBuilders.size(); 
  11.    List<SecurityFilterChain> securityFilterChains = new ArrayList<>(chainSize); 
  12.     // 初始化過濾器鏈集合中的 忽略請求過濾器鏈     
  13.     for (RequestMatcher ignoredRequest : this.ignoredRequests) { 
  14.       securityFilterChains.add(new DefaultSecurityFilterChain(ignoredRequest)); 
  15.    } 
  16.     // 初始化過濾器鏈集合中的 httpsecurity定義的過濾器鏈 
  17.    for (SecurityBuilder<? extends SecurityFilterChain> securityFilterChainBuilder : this.securityFilterChainBuilders) { 
  18.       securityFilterChains.add(securityFilterChainBuilder.build()); 
  19.    } 
  20.    FilterChainProxy filterChainProxy = new FilterChainProxy(securityFilterChains); 
  21.    if (this.httpFirewall != null) { 
  22.        // 請求防火墻 
  23.       filterChainProxy.setFirewall(this.httpFirewall); 
  24.    } 
  25.    if (this.requestRejectedHandler != null) { 
  26.        // 請求拒絕處理器 
  27.       filterChainProxy.setRequestRejectedHandler(this.requestRejectedHandler); 
  28.    } 
  29.    filterChainProxy.afterPropertiesSet(); 
  30.  
  31.    Filter result = filterChainProxy; 
  32.    if (this.debugEnabled) { 
  33.       this.logger.warn("\n\n" + "********************************************************************\n" 
  34.             + "**********        Security debugging is enabled.       *************\n" 
  35.             + "**********    This may include sensitive information.  *************\n" 
  36.             + "**********      Do not use in a production system!     *************\n" 
  37.             + "********************************************************************\n\n"); 
  38.       result = new DebugFilter(filterChainProxy); 
  39.    } 
  40.    this.postBuildAction.run(); 
  41.    return result; 

從上面中的源碼可以看出,WebSecurity用來構(gòu)建一個名為springSecurityFilterChain的Spring BeanFilterChainProxy 。它的作用是來定義那些請求忽略安全控制,那些請求必須安全控制,在合適的時候清除SecurityContext以避免內(nèi)存泄漏,同時也可以用來定義請求防火墻和請求拒絕處理器,另外我們開啟Spring Seuciry Debug模式也是這里配置的。

同時還有一個作用可能是其它文章沒有提及的,F(xiàn)ilterChainProxy是Spring Security對Spring framework應(yīng)用的唯一出口,然后通過它與一個Servlet在Spring的橋接代理DelegatingFilterProxy結(jié)合構(gòu)成Spring對Servlet體系的唯一出口。這樣就將Spring Security、Spring framework、Servlet API三者隔離了起來。

總結(jié)

 

我們事實上可以認(rèn)為,WebSecurity是Spring Security對外的唯一出口,而HttpSecurity只是內(nèi)部安全策略的定義方式;WebSecurity對標(biāo)FilterChainProxy,而HttpSecurity則對標(biāo)SecurityFilterChain,另外它們的父類都是AbstractConfiguredSecurityBuilder。掌握了這些基本上你就能知道它們之間的區(qū)別是什么了。

本文轉(zhuǎn)載自微信公眾號「碼農(nóng)小胖哥」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系碼農(nóng)小胖哥公眾號。

 

責(zé)任編輯:武曉燕 來源: 碼農(nóng)小胖哥
相關(guān)推薦

2021-04-23 07:33:10

SpringSecurity單元

2021-01-28 09:50:29

分布式對象SharedObjec

2021-05-31 07:18:46

SpringSecurity信息

2019-11-22 09:40:40

SpringJava編程語言

2025-06-30 01:33:00

2023-04-10 11:41:15

2021-08-29 18:36:57

項目

2009-06-18 14:18:23

Spring secu

2022-01-26 00:05:00

接口Spring管理器

2022-05-19 11:29:14

計時攻擊SpringSecurity

2023-12-08 12:12:21

2022-11-26 00:00:02

2009-07-21 16:49:41

整合iBatis和SpSqlMapClien

2022-08-30 08:36:13

Spring權(quán)限控制

2022-08-15 08:45:21

Spring權(quán)限控制

2022-08-30 08:43:11

Spring權(quán)限控制

2022-08-15 08:42:46

權(quán)限控制Spring

2022-06-16 10:38:24

URL權(quán)限源代碼

2022-08-30 08:55:49

Spring權(quán)限控制

2022-08-30 08:50:07

Spring權(quán)限控制
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 狠狠久| 成人av一区二区三区 | 天堂中文资源在线 | 亚洲av毛片 | 国产视频在线观看一区二区三区 | 丁香五月网久久综合 | 91网在线播放 | 丁香综合 | 亚洲色在线视频 | 国产一区中文字幕 | 99国产视频 | 日本又色又爽又黄的大片 | 伊人狼人影院 | 成人a视频片观看免费 | 欧美寡妇偷汉性猛交 | 日韩成人在线免费观看 | 国产性生活一级片 | 精品一区二区久久久久久久网站 | 久久99久久98精品免观看软件 | 精品一区欧美 | 国产精品久久久久久久久久免费 | www.日韩 | 色婷婷综合成人av | 亚洲一区二区三区在线 | 亚洲视频区 | 久久精品久久久 | 天天干视频在线 | 国产高清毛片 | 国产国产精品久久久久 | 日韩国产免费 | 一区二区三区四区电影视频在线观看 | 美女天天操 | 久久精品国产99国产精品 | 午夜影院 | 久久人人爽人人爽人人片av免费 | 日本精品视频一区二区 | 色成人免费网站 | www.蜜桃av | 天天看天天干 | 午夜日韩 | 永久网站 |