自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

[[393896]]

前幾天有粉絲私信我:WebSecurity和HttpSecurity啥關(guān)系?當時給我問住了,我大概只知道它們之間的關(guān)系類似TypeScript和JavaScript的關(guān)系,但是具體的細節(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進行。還得拿出這張老圖:

安全過濾鏈

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

WebSecurity的本質(zhì)

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

多個SecurityFilterChain

為了精細化的管理多個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é)

 

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

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

 

責任編輯:武曉燕 來源: 碼農(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編程語言

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:50:07

Spring權(quán)限控制

2022-08-15 08:42:46

權(quán)限控制Spring

2022-08-30 08:43:11

Spring權(quán)限控制

2022-08-30 08:36:13

Spring權(quán)限控制

2022-08-30 08:55:49

Spring權(quán)限控制

2022-08-15 08:45:21

Spring權(quán)限控制

2022-06-16 10:38:24

URL權(quán)限源代碼

2020-03-31 14:57:56

數(shù)據(jù)挖掘OLAP統(tǒng)計
點贊
收藏

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