WebSecurityConfigurer與ResourceServerConfigurer

WebSecurityConfigurerAdapter與ResourceServerConfigurerAdapter

WebSecurityConfigurer是springsecurity框架配置的類
ResourceServerConfigurerAdapter是oauth2框架配置的類

1、springsecurity的配置

Java在正常servelet處理http的請求可能會經過很多的filter,大體例子像下面這個:
在這裏插入圖片描述
而spring security又是怎麼處理的呢,詳見下圖:
在這裏插入圖片描述
從圖中可以看出spring security自己有一個叫FilterChainProxy代理類,該類也實現了servlet接口。FilterChainProxy內部有一個List filterChains,而SecurityFilterChain是一個接口也是一個chain,每個chain裏有若干個filter.既然有多個filter chain,那麼來了一個http請求,這個請求(通過該請求的url來判斷)應該由哪個或者哪些filter chain來進行處理呢?
在spring security裏一個請只會被一個filter chain進行處理,也就是spring security通過遍歷filterChains這個集合時,只要找到能處理該請求的filter chain就不再進行其他的filter chain匹配。
如下圖:
在這裏插入圖片描述
比如來了一個請求,url是:/foo/**,那麼他會被會第一個filter chain處理,後面的兩個filter chain會被忽略掉。`

當我們在spring boot引入了spring-security的相關包時,security默認會爲我們創建一個默認WebSecurityConfigurerAdapter,他攔截所有的http請求(/**),且這個Order的值是:@Order(100) ,order值越小過濾鏈越在前。Security默認還會爲我們創建一些filter:

2、ResourceServerConfigurer的配置

WebSecurityConfigurerAdapter與ResourceServerConfigurerAdapter同時在的話且都配置了處理url爲:/api/**,默認是後者會生效。
因爲默認的WebSecurityConfigurerAdapter裏的@Order值是100(我們可以在該類上可以明確看到@Order(100)),而我們在ResourceServerConfigurerAdapter上添加了@EnableResourceServer註解,這個玩意兒是幹什麼用的呢?他其中之一就是定義了@Order值爲3(該註解裏引用了ResourceServerConfiguration,這個類裏面定義了Order值).在spring 的體系裏Order值越小優先級越高,所以ResourceServerConfigurerAdapter優先級比另外一個更高,他會優先處理,而WebSecurityConfigurerAdapter會失效。

3、之間的關係

他們所屬的功能模塊不同,前者spring security的,後者是spring security oauth2裏的。他們都是Adapter,他們都會產生一個filter Chain,他們兩者可以相互配合來對不同的Url進行權限控制。

但是,我們經常在寫代碼的時候經常會出現這種情況,當我們在做oauth2的時候,當把兩個類同時放在項目的時候,都聲明瞭對http url的不同處理,但是就是ResourceServerConfigurerAdapter會把的http配置信息完全被覆蓋掉,最後形成了,所有的請求只會在ResourceServerConfigurerAdapter的fitler chain中處理,導致用戶不知道這兩者到底是怎麼回事。

這其實是因爲對spring security的配置不熟悉導致的,也就是antMatcher()和authorizeRequests().antMatchers()。

4、例子

只會攔截匹配到/user/**的請求,其他請求會被其他攔截器攔截
在這裏插入圖片描述
攔截所有請求,/api/*需要有權限,其他地址都放行
在這裏插入圖片描述
上面這個例子,本意是想/api/
端點須要被認證且要有USER權限;/user/**的端點須要被認證,

但是最終的結果是WebSecurityConfigurerAdapter相關的配置信息沒生效。
因爲ResourceServerConfigurer的優先級高,請求被它的過濾鏈所攔截
導致/user/**的接口會被放行

但是如果這麼配置:
在這裏插入圖片描述
/api/**會被ResourceServerConfigurer攔截
/user/**會被WebSecurityConfigurer攔截
這樣纔是對的

5、antMatcher與authorizeRequests

antMatcher()是HttpSecurity的一個方法,他只告訴了Spring我只配置了一個我這個Adapter能處理哪個的url,它與authorizeRequests()沒有任何關係。
然後使用authorizeRequests().antMatchers()是告訴你在antMatchers()中指定的一個或多個路徑,比如執行permitAll()或hasRole()。他們在第一個http.antMatcher()匹配時就會生效。
所以,WebSecurityConfigurerAdapter與ResourceServerConfigurerAdapter同時使用,其實和spring security的多個HttpSecurity配置是一樣的,原理也差不多是一樣的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章