spring - 为什么我们需要在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 的安全类是否只会在启动时调用一次?
解决方案
- 为什么我们通常需要打电话
我们正在配置。不打电话!
- 另外,扩展 WebSecurityConfigurerAdapter 的安全类是否只会在启动时调用一次?
是的,配置方法将在启动时执行(运行时多态)以设置 HttpSecurity 或配置 spring 安全过滤器。
简单来说,Spring Security 是一个基于过滤器的框架。我们要么启用现有过滤器并对其进行配置,要么添加我们的自定义过滤器。
configure()
方法用于设置现有的过滤器设置后我们可以修改那些过滤器配置。如果您对配置的修改不能满足您的要求,那么您可以定义自己的自定义文件管理器。要定义自定义过滤器,有以下三个*规定
(实际上是 4 addFilterAt(),很少使用)
--------------------------------------------------------------------------------------
| java-config | xml-config |
--------------------------------------------------------------------------------------
| .addFilter() | <custom-filter position="BASIC_AUTH_FILTER"/> |
--------------------------------------------------------------------------------------
| .addFilterBefore() | <custom-filter before="LAST" /> |
--------------------------------------------------------------------------------------
| .addFilterAfter() | <custom-filter after="FIRST" /> |
--------------------------------------------------------------------------------------
- 简单来说。
.addFilter()
您可以只添加弹簧定义过滤器的实例,也可以添加这些弹簧安全定义过滤器的子类。例如
.addFilter(customAuthFilter, UsernamePasswordAuthenticationFilter.class)
customAuthFilter 应该是UsernamePasswordAuthenticationFilter
子类的实例或UsernamePasswordAuthenticationFilter
..addFilterAfter()
这里.addFilterBefore()
过滤器可以是任何自定义过滤器。但是,自定义过滤器应该是GenericFilterBean
. 在大多数情况下,OncePerRequestFilter
将使用 的实现。
您可以参考spring security中的执行顺序进行详细分析。
推荐阅读
- pandas - 减去索引数据框中的行
- javascript - 如何在组合高图表中隐藏系列数据和类别
- c# - 为什么某些 C# 库函数不遵循“ref”参数传递约定
- android - 如何使用此代码实现下一个和上一个按钮?
- audio - 使用 FFmpeg 将多个音频文件交叉淡化为一个?
- android - 无法运行 adb 进程
- python - 如何将列表中的某些分数分配给多个列表中的值并获取python中每个值的总和?
- c++ - 我在主函数的左括号上不断收到错误消息 obj\Debug\main.o||In function `ZN11linked_listC1Ev':|
- idris - 关于 `mod` 的 Idris 证明
- java - Java继承如何区分程序中的用户类型?