如何查看 Spring Security 过滤器链?

一 引言

Spring Security 作为一个强大的安全框架,其核心是基于一系列的 Filter。这些过滤器按照一定的顺序执行,形成了一个过滤器链,每个过滤器负责处理特定的安全任务。在本文中,我们将探讨如何发现和理解 Spring Security 中注册的过滤器。

二 启用安全调试

要查看 Spring Security 的过滤器链,首先可以通过启用安全调试来实现。这将为每个请求记录详细的安全信息。

1
@EnableWebSecurity(debug = true)

启用调试后,服务器接收到请求时会记录所有相关信息,包括完整的安全过滤器链。

不过这是一个敏感操作,只可以在开发环境下开启,生产环境就不要开启了。

三 日志记录

另一种查看注册的 Spring Security 过滤器的方法是通过日志记录。可以通过在 application.properties 中设置日志级别来实现:

1
logging.level.org.springframework.security.web.FilterChainProxy=trace

这样,每次请求处理时,控制台都会输出每个过滤器的详细信息。方便我们观察与排查错误:

四 代码获取过滤器

除了手动查看日志,我们还可以通过编写代码来程序化地获取注册的过滤器。

首先,需要注入 springSecurityFilterChain 这个Bean:

1
2
3
@Autowired
@Qualifier("springSecurityFilterChain")
private Filter springSecurityFilterChain;

然后,将该对象转换为 FilterChainProxy 类型,并调用getFilterChains() 方法来获取所有过滤器链:

1
2
3
4
5
6
7
public void listFilters() {
FilterChainProxy filterChainProxy = (FilterChainProxy) springSecurityFilterChain;
List<SecurityFilterChain> chains = filterChainProxy.getFilterChains();
chains.stream()
.flatMap(chain -> chain.getFilters().stream())
.forEach(filter -> System.out.println(filter.getClass().getName()));
}

执行上述代码,将输出所有注册的过滤器的类名。

五 重要过滤器

在 Spring Security 中,有几个过滤器扮演着特别重要的角色:

  • UsernamePasswordAuthenticationFilter:处理用户登录认证。
  • AnonymousAuthenticationFilter:在没有认证对象的情况下创建匿名认证,既匿名用户也是用户的一种。
  • AuthorizationFilter:当访问被拒绝时抛出异常(旧版是 FilterSecurityInterceptor)。
  • ExceptionTranslationFilter:捕获 Spring Security 的异常。

六 结论

通过本文,我们学习了如何通过不同的方法来发现 Spring Security 中注册的过滤器,包括启用安全调试、日志记录以及程序化获取。这些方法可以帮助开发者更好地理解和配置 Spring Security 的过滤器链。

如果小伙伴们想要深入全面的学习 Spring Security,可以看看我最近录的最新版的 Spring Security+OAuth2 视频教程,这是视频目录:

这套视频教程基本上把 Spring Security 的方方面面以及 OAuth2 都讲到了。最重要的是,贴合了很多小伙伴们日常常见的开发场景,比如短信验证码登录,微信 OAuth2 登录等等都有讲到。

这套视频是基于目前最新版的 Spring Security6 录制的,Spring Security6 在 API 层面的变化还是蛮大的,引入了大量的 Lambda 表达式去简化配置,很多旧版的写法在 Spring Security6 中被废弃,并在将来在 Spring Security7 中会移除相关的 API,所以说最近的 Spring Security 更新还是蛮激进的。

另一方面就是这套视频包含了全新的基于目前最新版 Spring Security 录制的 OAuth2 教程,松哥在 2020 年的时候出过图文版的 OAuth2 教程,但是,现在新版的 OAuth2 也有很多变化,不仅仅是 API 层面的变化,授权模式也发生了一些变化,传统的密码模式、简化模式现在都不再支持,转而引入了 PKCE 模式,并且利用 OIDC 简化用户信息获取。同时,在 2020 年还处于萌芽状态的 Spring Security OAuth2 Server 这个项目,目前也趋于成熟,也可以直接使用了,这些松哥都在视频中和大家做了详细介绍。在 OAuth2 环节我也和大家分享了如何使用微信的 OAuth2 登录。

总之这一套教程,让大家彻底理解系统的安全管理。

之前有小伙伴说我直接自己写过滤器,既灵活还简单。我并不反对这种做法,但是有一个前提就是你很牛,你自己写的过滤器有考虑到计时攻击,有考虑到 XSS 攻击,有考虑到点击劫持,有考虑跨站请求伪造。。。等等太多了。当然,这些问题如果你都没有考虑到,那么 Spring Security 都有帮你考虑到并提供解决方案!

理解了 Spring Security,再去看市面上其他的安全管理框架,都会豁然开朗。

这套教程目前给小伙伴们提供了两个试看视频:

这套视频是付费的,¥499,有需要的小伙伴加微信备注 499 上车。