Spring Security和多个过滤器链

Spring Security是一项非常有用的技术。 它使您可以保护应用程序而不会过于侵入,并允许插入许多不同的身份验证机制。 另一方面,要使用它并不是那么容易,并且每次接触它时我都必须重新学习这些工具之一。 在这篇文章中,我将介绍Spring安全性的一些基础知识,以及如何使用它以不同的方式保护应用程序的不同部分。

Spring安全配置

让我们看一下Spring Security的一部分配置,您可以在Github上找到完整的源代码 。 我正在使用Spring Boot,但是对于所有Spring应用程序,大多数部分应该是相同的。

 @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/以下的所有内容)。 允许所有其他请求(以/**表示)。 此处使用的模式是Ant路径语法,但是您也可以使用不同的RequestMatcher来决定应用程序的哪些部分需要哪种身份验证。

Spring boot的所有功能都在过滤器链中实现。 上面对httpBasic()的调用实际上只是确保将相关过滤器添加到过滤器链中。 在这种情况下, BasicAuthenticationFilter将检查是否存在一个Authorization标头并对其进行评估。 如果找到一个,它将在上下文中添加一个Authentication对象,并执行其余的过滤器链。 在该链的末尾是FilterSecurityInterceptor ,它检查所请求的资源是否需要身份验证,以及所设置的资源是否符合所请求的角色。 Spring Security和多个过滤器链_第1张图片

您还可以通过配置WebSecurity将应用程序的某些部分从身份验证中WebSecurity 以下方法确保对/resources/所有请求都跳过上面的配置。

 @Override  public void configure(WebSecurity web) throws Exception { 
     web.ignoring().antMatchers( "/resources/**" );  } 

在幕后,这将添加一个附加的过滤器链,该过滤器链针对配置的路径触发,但不执行任何操作。

多个过滤链

有时可能需要对应用程序的不同部分使用不同的身份验证机制。 为此,Spring Security允​​许您添加几个配置对象。 为此通常使用内部配置类,这些内部配置类也可以共享封闭应用程序的某些部分。 下列类添加了两个不同的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 这些类中的每一个都添加一个过滤器链,并执行第一个匹配的链。 @Order批注可用于影响过滤器链的顺序,以确保首先执行正确的过滤器链。

也可能有必要将过滤器链限制为仅应用程序的特定部分,以免其他部分触发该过滤器链。 ActuatorConfiguration被限制为仅将请求匹配到/management/ 请注意,配置中有两个不同的地方可以接受RequestMatcher 开头的一个限制了触发过滤链的网址。 authorizeRequests()之后的请求用于定义哪些请求需要哪种身份验证。

请注意,配置WebSecurity并不与HttpSecurity配置之一绑定,因为它们添加了自己的过滤器链,只是顺序可能有所不同。 如果在两种配置中都添加了模式,它甚至可以在WebSecurity的同一实例上WebSecurity

最后一件事:如果您使用的是自定义身份验证过滤器(例如,基于令牌的身份验证),则可能需要注意不要将过滤器也注册为Servlet过滤器。 您可以通过配置一个返回FilterRegistrationBean的方法并接受Filter的实例来影响它。 只要创建一个新的FilterRegistrationBean为您的过滤器,并设置enabledfalse

翻译自: https://www.javacodegeeks.com/2017/08/spring-security-multiple-filter-chains.html

你可能感兴趣的:(Spring Security和多个过滤器链)