欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

HttpSecurity是什么

這篇文章主要介紹“HttpSecurity是什么”,在日常操作中,相信很多人在HttpSecurity是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”HttpSecurity是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

公司主營業(yè)務(wù):成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出容城免費做網(wǎng)站回饋大家。

1.抽絲剝繭

首先我們來看下 HttpSecurity 的繼承關(guān)系圖:

HttpSecurity是什么  

可以看到,HttpSecurity 繼承自 AbstractConfiguredSecurityBuilder,同時實現(xiàn)了 SecurityBuilder 和 HttpSecurityBuilder 兩個接口。

我們來看下 HttpSecurity 的定義:

public final class HttpSecurity extends
  AbstractConfiguredSecurityBuilder<DefaultSecurityFilterChain, HttpSecurity>
  implements SecurityBuilder<DefaultSecurityFilterChain>,
  HttpSecurityBuilder<HttpSecurity> {
        //...
}
 

這里每一個類都帶有泛型,看得人有點眼花繚亂。

我把這個泛型類拿出來和大家講一下,小伙伴們就明白了。

泛型主要是兩個,DefaultSecurityFilterChain 和 HttpSecurity,HttpSecurity 就不用說了,這是我們今天的主角,那么 DefaultSecurityFilterChain 是干嘛的?

這我們就得從 SecurityFilterChain 說起了。

 

1.1 SecurityFilterChain

先來看定義:

public interface SecurityFilterChain {
 boolean matches(HttpServletRequest request);
 List<Filter> getFilters();
}
 

SecurityFilterChain 其實就是我們平時所說的 Spring Security 中的過濾器鏈,它里邊定義了兩個方法,一個是 matches 方法用來匹配請求,另外一個 getFilters 方法返回一個 List 集合,集合中放著 Filter 對象,當(dāng)一個請求到來時,用 matches 方法去比較請求是否和當(dāng)前鏈吻合,如果吻合,就返回 getFilters 方法中的過濾器,那么當(dāng)前請求會逐個經(jīng)過 List 集合中的過濾器。這

SecurityFilterChain 接口只有一個實現(xiàn)類,那就是 DefaultSecurityFilterChain:

public final class DefaultSecurityFilterChain implements SecurityFilterChain {
 private static final Log logger = LogFactory.getLog(DefaultSecurityFilterChain.class);
 private final RequestMatcher requestMatcher;
 private final List<Filter> filters;

 public DefaultSecurityFilterChain(RequestMatcher requestMatcher, Filter... filters) {
  this(requestMatcher, Arrays.asList(filters));
 }

 public DefaultSecurityFilterChain(RequestMatcher requestMatcher, List<Filter> filters) {
  logger.info("Creating filter chain: " + requestMatcher + ", " + filters);
  this.requestMatcher = requestMatcher;
  this.filters = new ArrayList<>(filters);
 }

 public RequestMatcher getRequestMatcher() {
  return requestMatcher;
 }

 public List<Filter> getFilters() {
  return filters;
 }

 public boolean matches(HttpServletRequest request) {
  return requestMatcher.matches(request);
 }

 @Override
 public String toString() {
  return "[ " + requestMatcher + ", " + filters + "]";
 }
}
 

DefaultSecurityFilterChain 只是對 SecurityFilterChain 中的方法進行了實現(xiàn),并沒有特別值得說的地方,松哥也就不啰嗦了。

那么從上面的介紹中,大家可以看到,DefaultSecurityFilterChain 其實就相當(dāng)于是 Spring Security 中的過濾器鏈,一個 DefaultSecurityFilterChain 代表一個過濾器鏈,如果系統(tǒng)中存在多個過濾器鏈,則會存在多個 DefaultSecurityFilterChain 對象。

接下來我們把 HttpSecurity 的這幾個父類捋一捋。

 

1.2 SecurityBuilder

public interface SecurityBuilder<O> {
 O build() throws Exception;
}
 

SecurityBuilder 就是用來構(gòu)建過濾器鏈的,在 HttpSecurity 實現(xiàn) SecurityBuilder 時,傳入的泛型就是 DefaultSecurityFilterChain,所以 SecurityBuilder#build 方法的功能很明確,就是用來構(gòu)建一個過濾器鏈出來。

 

1.3 HttpSecurityBuilder

HttpSecurityBuilder 看名字就是用來構(gòu)建 HttpSecurity 的。不過它也只是一個接口,具體的實現(xiàn)在 HttpSecurity 中,接口定義如下:

public interface HttpSecurityBuilder<H extends HttpSecurityBuilder<H>> extends
  SecurityBuilder<DefaultSecurityFilterChain> {
 <C extends SecurityConfigurer<DefaultSecurityFilterChain, H>> C getConfigurer(
   Class<C> clazz);
 <C extends SecurityConfigurer<DefaultSecurityFilterChain, H>> C removeConfigurer(
   Class<C> clazz);
 <C> void setSharedObject(Class<C> sharedType, C object);
 <C> C getSharedObject(Class<C> sharedType);
 H authenticationProvider(AuthenticationProvider authenticationProvider);
 H userDetailsService(UserDetailsService userDetailsService) throws Exception;
 H addFilterAfter(Filter filter, Class<? extends Filter> afterFilter);
 H addFilterBefore(Filter filter, Class<? extends Filter> beforeFilter);
 H addFilter(Filter filter);
}
 

這里的方法比較簡單:

  1. getConfigurer 獲取一個配置對象。Spring Security 過濾器鏈中的所有過濾器對象都是由 xxxConfigure 來進行配置的,這里就是獲取這個 xxxConfigure 對象。
  2. removeConfigurer 移除一個配置對象。
  3. setSharedObject/getSharedObject 配置/獲取由多個 SecurityConfigurer 共享的對象。
  4. authenticationProvider 方法表示配置驗證器。
  5. userDetailsService 配置數(shù)據(jù)源接口。
  6. addFilterAfter 在某一個過濾器之前添加過濾器。
  7. addFilterBefore 在某一個過濾器之后添加過濾器。
  8. addFilter 添加一個過濾器,該過濾器必須是現(xiàn)有過濾器鏈中某一個過濾器或者其擴展。

這便是 HttpSecurityBuilder 中的功能,這些接口在 HttpSecurity 中都將得到實現(xiàn)。

 

1.4 AbstractSecurityBuilder

AbstractSecurityBuilder 類實現(xiàn)了 SecurityBuilder 接口,該類中主要做了一件事,就是確保整個構(gòu)建只被構(gòu)建一次。

public abstract class AbstractSecurityBuilder<O> implements SecurityBuilder<O> {
 private AtomicBoolean building = new AtomicBoolean();
 private O object;
 public final O build() throws Exception {
  if (this.building.compareAndSet(false, true)) {
   this.object = doBuild();
   return this.object;
  }
  throw new AlreadyBuiltException("This object has already been built");
 }
 public final O getObject() {
  if (!this.building.get()) {
   throw new IllegalStateException("This object has not been built");
  }
  return this.object;
 }
 protected abstract O doBuild() throws Exception;
}
 

可以看到,這里重新定義了 build 方法,并設(shè)置 build 方法為 final 類型,無法被重寫,在 build 方法中,通過 AtomicBoolean 實現(xiàn)該方法只被調(diào)用一次。具體的構(gòu)建邏輯則定義了新的抽象方法 doBuild,將來在實現(xiàn)類中通過 doBuild 方法定義構(gòu)建邏輯。

 

1.5 AbstractConfiguredSecurityBuilder

AbstractSecurityBuilder 方法的實現(xiàn)類就是 AbstractConfiguredSecurityBuilder。

AbstractConfiguredSecurityBuilder 中所做的事情就比較多了,我們分別來看。

首先 AbstractConfiguredSecurityBuilder 中定義了一個枚舉類,將整個構(gòu)建過程分為 5 種狀態(tài),也可以理解為構(gòu)建過程生命周期的五個階段,如下:

private enum BuildState {
 UNBUILT(0),
 INITIALIZING(1),
 CONFIGURING(2),
 BUILDING(3),
 BUILT(4);
 private final int order;
 BuildState(int order) {
  this.order = order;
 }
 public boolean isInitializing() {
  return INITIALIZING.order == order;
 }
 public boolean isConfigured() {
  return order >= CONFIGURING.order;
 }
}
 

五種狀態(tài)分別是 UNBUILT、INITIALIZING、CONFIGURING、BUILDING 以及 BUILT。另外還提供了兩個判斷方法,isInitializing 判斷是否正在初始化,isConfigured 表示是否已經(jīng)配置完畢。

AbstractConfiguredSecurityBuilder 中的方法比較多,松哥在這里列出來兩個關(guān)鍵的方法和大家分析:

private <C extends SecurityConfigurer<O, B>> void add(C configurer) {
 Assert.notNull(configurer, "configurer cannot be null");
 Class<? extends SecurityConfigurer<O, B>> clazz = (Class<? extends SecurityConfigurer<O, B>>) configurer
   .getClass();
 synchronized (configurers) {
  if (buildState.isConfigured()) {
   throw new IllegalStateException("Cannot apply " + configurer
     + " to already built object");
  }
  List<SecurityConfigurer<O, B>> configs = allowConfigurersOfSameType ? this.configurers
    .get(clazz) : null;
  if (configs == null) {
   configs = new ArrayList<>(1);
  }
  configs.add(configurer);
  this.configurers.put(clazz, configs);
  if (buildState.isInitializing()) {
   this.configurersAddedInInitializing.add(configurer);
  }
 }
}
private Collection<SecurityConfigurer<O, B>> getConfigurers() {
 List<SecurityConfigurer<O, B>> result = new ArrayList<>();
 for (List<SecurityConfigurer<O, B>> configs : this.configurers.values()) {
  result.addAll(configs);
 }
 return result;
}
 

第一個就是這個 add 方法,這相當(dāng)于是在收集所有的配置類。將所有的 xxxConfigure 收集起來存儲到 configurers 中,將來再統(tǒng)一初始化并配置,configurers 本身是一個 LinkedHashMap ,key 是配置類的 class,value 是一個集合,集合里邊放著 xxxConfigure 配置類。當(dāng)需要對這些配置類進行集中配置的時候,會通過 getConfigurers 方法獲取配置類,這個獲取過程就是把 LinkedHashMap 中的 value 拿出來,放到一個集合中返回。

另一個方法就是 doBuild 方法。

@Override
protected final O doBuild() throws Exception {
 synchronized (configurers) {
  buildState = BuildState.INITIALIZING;
  beforeInit();
  init();
  buildState = BuildState.CONFIGURING;
  beforeConfigure();
  configure();
  buildState = BuildState.BUILDING;
  O result = performBuild();
  buildState = BuildState.BUILT;
  return result;
 }
}
private void init() throws Exception {
 Collection<SecurityConfigurer<O, B>> configurers = getConfigurers();
 for (SecurityConfigurer<O, B> configurer : configurers) {
  configurer.init((B) this);
 }
 for (SecurityConfigurer<O, B> configurer : configurersAddedInInitializing) {
  configurer.init((B) this);
 }
}
private void configure() throws Exception {
 Collection<SecurityConfigurer<O, B>> configurers = getConfigurers();
 for (SecurityConfigurer<O, B> configurer : configurers) {
  configurer.configure((B) this);
 }
}
 

在 AbstractSecurityBuilder 類中,過濾器的構(gòu)建被轉(zhuǎn)移到 doBuild 方法上面了,不過在 AbstractSecurityBuilder 中只是定義了抽象的 doBuild 方法,具體的實現(xiàn)在 AbstractConfiguredSecurityBuilder。

doBuild 方法就是一邊更新狀態(tài),進行進行初始化。

beforeInit 是一個預(yù)留方法,沒有任何實現(xiàn)。

init 方法就是找到所有的 xxxConfigure,挨個調(diào)用其 init 方法進行初始化。

beforeConfigure 是一個預(yù)留方法,沒有任何實現(xiàn)。

configure 方法就是找到所有的 xxxConfigure,挨個調(diào)用其 configure 方法進行配置。

最后則是 performBuild 方法,是真正的過濾器鏈構(gòu)建方法,但是在 AbstractConfiguredSecurityBuilder 中 performBuild 方法只是一個抽象方法,具體的實現(xiàn)在 HttpSecurity 中。

這便是 HttpSecurity 所有父類、父接口的功能。

看完了父輩,接下來回到我們今天文章的主題,HttpSecurity。

 

2. HttpSecurity

HttpSecurity 做的事情,就是進行各種各樣的 xxxConfigurer 配置。

隨便舉幾例:

public CorsConfigurer<HttpSecurity> cors() throws Exception {
 return getOrApply(new CorsConfigurer<>());
}
public CsrfConfigurer<HttpSecurity> csrf() throws Exception {
 ApplicationContext context = getContext();
 return getOrApply(new CsrfConfigurer<>(context));
}
public ExceptionHandlingConfigurer<HttpSecurity> exceptionHandling() throws Exception {
 return getOrApply(new ExceptionHandlingConfigurer<>());
}
 

HttpSecurity 中有大量類似的方法,過濾器鏈中的過濾器就是這樣一個一個配置的。我就不一一介紹了。

每個配置方法的結(jié)尾都會來一句 getOrApply,這個是干嘛的?

private <C extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity>> C getOrApply(
  C configurer) throws Exception {
 C existingConfig = (C) getConfigurer(configurer.getClass());
 if (existingConfig != null) {
  return existingConfig;
 }
 return apply(configurer);
}
 

getConfigurer 方法是在它的父類 AbstractConfiguredSecurityBuilder 中定義的,目的就是去查看當(dāng)前這個 xxxConfigurer 是否已經(jīng)配置過了。

如果當(dāng)前 xxxConfigurer 已經(jīng)配置過了,則直接返回,否則調(diào)用 apply 方法,這個 apply 方法最終會調(diào)用到 AbstractConfiguredSecurityBuilder#add 方法,將當(dāng)前配置 configurer 收集起來。

HttpSecurity 中還有一個 addFilter 方法:

public HttpSecurity addFilter(Filter filter) {
 Class<? extends Filter> filterClass = filter.getClass();
 if (!comparator.isRegistered(filterClass)) {
  throw new IllegalArgumentException(
    "The Filter class "
      + filterClass.getName()
      + " does not have a registered order and cannot be added without a specified order. Consider using addFilterBefore or addFilterAfter instead.");
 }
 this.filters.add(filter);
 return this;
}
 

這個 addFilter 方法的作用,主要是在各個 xxxConfigurer 進行配置的時候,會調(diào)用到這個方法,(xxxConfigurer 就是用來配置過濾器的),把 Filter 都添加到 fitlers 變量中。

最終在 HttpSecurity 的 performBuild 方法中,構(gòu)建出來一個過濾器鏈:

@Override
protected DefaultSecurityFilterChain performBuild() {
 filters.sort(comparator);
 return new DefaultSecurityFilterChain(requestMatcher, filters);
}

先給過濾器排序,然后構(gòu)造 DefaultSecurityFilterChain 對象。

到此,關(guān)于“HttpSecurity是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

新聞名稱:HttpSecurity是什么
文章網(wǎng)址:http://chinadenli.net/article38/gphspp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、營銷型網(wǎng)站建設(shè)、建站公司軟件開發(fā)、網(wǎng)站設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
午夜激情视频一区二区| 日本免费熟女一区二区三区| 中国少妇精品偷拍视频| 91偷拍裸体一区二区三区| 日韩欧美第一页在线观看| 在线观看日韩欧美综合黄片| 91插插插外国一区二区| 成人日韩在线播放视频| 日韩少妇人妻中文字幕| 91人妻丝袜一区二区三区| 色婷婷成人精品综合一区| 亚洲香艳网久久五月婷婷| 亚洲日本加勒比在线播放| 精品推荐久久久国产av| 欧美一区日韩一区日韩一区| 色一情一乱一区二区三区码| 91精品蜜臀一区二区三区| 男人的天堂的视频东京热| 国产亚洲成av人在线观看| 久久综合九色综合欧美| 午夜福利92在线观看| 午夜久久精品福利视频| 夫妻性生活动态图视频| 日本加勒比在线观看不卡| 自拍偷拍福利视频在线观看| 国产午夜在线精品视频| 国产亚洲欧美日韩精品一区| 人妻熟女中文字幕在线| 国产精品欧美一级免费| 嫩呦国产一区二区三区av| 精产国品一二三区麻豆| 妻子的新妈妈中文字幕| 国产91人妻精品一区二区三区| 国产精品午夜小视频观看| 欧美日韩国产黑人一区| 高清不卡视频在线观看| 色婷婷人妻av毛片一区二区三区 | 日韩黄色大片免费在线| 日韩中文字幕人妻精品| 欧美日韩综合在线精品| 亚洲精品一区二区三区日韩|