javascript
Spring Security和多个过滤器链
Spring Security是一項非常有用的技術(shù)。 它使您可以保護應(yīng)用程序而不會過于侵入,并允許插入許多不同的身份驗證機制。 另一方面,要使用它并不是那么容易,并且每次接觸它時我都必須重新學(xué)習(xí)這些工具之一。 在這篇文章中,我將介紹Spring安全性的一些基礎(chǔ)知識,以及如何使用它以不同的方式保護應(yīng)用程序的不同部分。
Spring安全配置
讓我們看一下Spring Security的一部分配置,您可以在Github上找到完整的源代碼 。 我正在使用Spring Boot,但是對于所有Spring應(yīng)用程序,大多數(shù)部分應(yīng)該是相同的。
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .httpBasic() .and() .authorizeRequests().antMatchers( "/secret/**" ).authenticated() .and() .authorizeRequests().antMatchers( "/**" ).permitAll(); } }在最簡單的情況下,您只需使用Spring Security中常見的方法鏈接來配置HttpSecurity 。 在這種情況下,我們啟用HTTP基本身份驗證,并要求對一個端點進行身份驗證( /secure/以下的所有內(nèi)容)。 允許所有其他請求(以/**表示)。 此處使用的模式是Ant路徑語法,但是您也可以使用不同的RequestMatcher來決定應(yīng)用程序的哪些部分需要哪種身份驗證。
Spring boot的所有功能都在過濾器鏈中實現(xiàn)。 上面對httpBasic()的調(diào)用實際上只是確保將相關(guān)過濾器添加到過濾器鏈中。 在這種情況下, BasicAuthenticationFilter將檢查是否存在一個Authorization標(biāo)頭并對其進行評估。 如果找到一個,它將在上下文中添加一個Authentication對象,并執(zhí)行其余的過濾器鏈。 在該鏈的末尾是FilterSecurityInterceptor ,它檢查所請求的資源是否需要身份驗證,以及所設(shè)置的資源是否符合所請求的角色。
您還可以通過配置WebSecurity將應(yīng)用程序的某些部分從身份驗證中WebSecurity 。 以下方法確保對/resources/所有請求都跳過上面的配置。
@Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers( "/resources/**" ); }在幕后,這將添加一個附加的過濾器鏈,該過濾器鏈針對配置的路徑觸發(fā),但不執(zhí)行任何操作。
多個過濾鏈
有時可能需要對應(yīng)用程序的不同部分使用不同的身份驗證機制。 為此,Spring Security允??許您添加幾個配置對象。 為此通常使用內(nèi)部配置類,這些內(nèi)部配置類也可以共享封閉應(yīng)用程序的某些部分。 下列類添加了兩個不同的Spring Security過濾器鏈。
public class SecurityConfig { @Configuration public static class ApiConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // doesn't really make sense to protect a REST API using form login but it is just for illustration http .formLogin() .and() .authorizeRequests().antMatchers( "/secret/**" ).authenticated() .and() .authorizeRequests().antMatchers( "/**" ).permitAll(); } @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers( "/resources/**" ); } } @Order ( 1 ) @Configuration public static class ActuatorConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .antMatcher( "/management/**" ) .httpBasic() .and() .authorizeRequests().antMatchers( "/management/**" ).authenticated(); } @Override public void configure(WebSecurity web) throws Exception { super .configure(web); } } }這兩個類都繼承自適配器配置類,并配置其HttpSecurity 。 這些類中的每一個都添加一個過濾器鏈,并執(zhí)行第一個匹配的鏈。 @Order批注可用于影響過濾器鏈的順序,以確保首先執(zhí)行正確的過濾器鏈。
也可能有必要將過濾器鏈限制為僅應(yīng)用程序的特定部分,以免其他部分觸發(fā)該過濾器鏈。 ActuatorConfiguration被限制為僅將請求匹配到/management/ 。 請注意,配置中有兩個不同的地方可以接受RequestMatcher 。 開頭的一個限制了觸發(fā)過濾鏈的網(wǎng)址。 authorizeRequests()之后的請求用于定義哪些請求需要哪種身份驗證。
請注意,配置WebSecurity并不與HttpSecurity配置之一綁定,因為它們添加了自己的過濾器鏈,只是順序可能有所不同。 如果在兩種配置中都添加了模式,它甚至可以在WebSecurity的同一實例上WebSecurity 。
最后一件事:如果您使用的是自定義身份驗證過濾器(例如,基于令牌的身份驗證),則可能需要注意不要將過濾器也注冊為Servlet過濾器。 您可以通過配置一個返回FilterRegistrationBean的方法并接受Filter的實例來影響它。 只要創(chuàng)建一個新的FilterRegistrationBean為您的過濾器,并設(shè)置enabled以false 。
翻譯自: https://www.javacodegeeks.com/2017/08/spring-security-multiple-filter-chains.html
總結(jié)
以上是生活随笔為你收集整理的Spring Security和多个过滤器链的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: primefaces_轻量级Web应用程
- 下一篇: JSON处理1.1:100DaysOfJ