首页 > 解决方案 > 为什么我们需要在spring security configure(HttpSecurity http)方法中调用http.addFilterBefore()方法?

问题描述

我想了解为什么我们通常需要在初始 configure(HttpSecurity http) 方法中调用 http.addFilterBefore(jwtAuthenticationFilter(),UsernamePasswordAuthenticationFilter.class) 方法?据我了解,它将首先添加 jwtAuthenticationFilter() 的结果,然后是 UsernamePasswordAuthenticationFilter 但我不知道为什么?jwtAuthenticationFilter() 实现:

@Override
protected  void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
        authenticationManagerBuilder.userDetailsService(customerService).passwordEncoder(bCryptPasswordEncoder());
    }

另外,扩展 WebSecurityConfigurerAdapter 的安全类是否只会在启动时调用一次?

标签: springspring-bootspring-securityjwt

解决方案


  1. 为什么我们通常需要打电话

我们正在配置。不打电话!

  1. 另外,扩展 WebSecurityConfigurerAdapter 的安全类是否只会在启动时调用一次?

是的,配置方法将在启动时执行(运行时多态)以设置 HttpSecurity 或配置 spring 安全过滤器。


简单来说,Spring Security 是一个基于过滤器的框架。我们要么启用现有过滤器并对其进行配置,要么添加我们的自定义过滤器。

  1. configure()方法用于设置现有的过滤器设置后我们可以修改那些过滤器配置。如果您对配置的修改不能满足您的要求,那么您可以定义自己的自定义文件管理器。

  2. 要定义自定义过滤器,有以下三个*规定
    (实际上是 4 addFilterAt(),很少使用)

 --------------------------------------------------------------------------------------
| java-config                      | xml-config                                        |
 --------------------------------------------------------------------------------------
| .addFilter()                     | <custom-filter  position="BASIC_AUTH_FILTER"/>    |
 --------------------------------------------------------------------------------------
| .addFilterBefore()               | <custom-filter  before="LAST" />                  |
 --------------------------------------------------------------------------------------
| .addFilterAfter()                | <custom-filter  after="FIRST" />                  |
 -------------------------------------------------------------------------------------- 
  1. 简单来说。
  • .addFilter()您可以只添加弹簧定义过滤器的实例,也可以添加这些弹簧安全定义过滤器的子类。例如
    .addFilter(customAuthFilter, UsernamePasswordAuthenticationFilter.class)customAuthFilter 应该是UsernamePasswordAuthenticationFilter子类的实例或UsernamePasswordAuthenticationFilter.

  • .addFilterAfter()这里.addFilterBefore()过滤器可以是任何自定义过滤器。但是,自定义过滤器应该是GenericFilterBean. 在大多数情况下,OncePerRequestFilter将使用 的实现。

您可以参考spring security中的执行顺序进行详细分析。


推荐阅读