• 查找已注册的 Spring Security 过滤器


    1.概述

    Spring Security 基于一系列 servlet 过滤器。每个过滤器都有特定的职责,根据配置,添加或删除过滤器。

    在本教程中,我们将讨论查找已注册的 Spring Security Filters 的不同方法

    2.安全调试

    首先,我们将启用安全调试,它将记录每个请求的详细安全信息。

    我们可以使用调试属性启用安全调试:

    @EnableWebSecurity(debug = true)

    这样,当我们向服务器发送请求时,所有的请求信息都会被记录下来。

    我们还可以看到整个安全过滤器链:

    1. Security filter chain: [
    2. WebAsyncManagerIntegrationFilter
    3. SecurityContextPersistenceFilter
    4. HeaderWriterFilter
    5. LogoutFilter
    6. UsernamePasswordAuthenticationFilter
    7. // ...
    8. ]

    3. 记录

    接下来,我们将通过启用 FilterChainProxy的日志记录来找到我们的安全过滤器。

    我们可以通过将以下行添加到application.properties来启用日志记录:

    logging.level.org.springframework.security.web.FilterChainProxy=DEBUG

    以下是相关日志:

    1. DEBUG o.s.security.web.FilterChainProxy - /foos/1 at position 1 of 12 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter'
    2. DEBUG o.s.security.web.FilterChainProxy - /foos/1 at position 2 of 12 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter'
    3. DEBUG o.s.security.web.FilterChainProxy - /foos/1 at position 3 of 12 in additional filter chain; firing Filter: 'HeaderWriterFilter'
    4. DEBUG o.s.security.web.FilterChainProxy - /foos/1 at position 4 of 12 in additional filter chain; firing Filter: 'LogoutFilter'
    5. DEBUG o.s.security.web.FilterChainProxy - /foos/1 at position 5 of 12 in additional filter chain; firing Filter: 'UsernamePasswordAuthenticationFilter'
    6. ...

    4. 以编程方式获取过滤器 

    现在,我们将了解如何以编程方式获取已注册的安全过滤器。

    我们将使用 FilterChainProxy来获取安全过滤器。

    首先,让我们自动装配springSecurityFilterChain bean:

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

    在这里,我们使用了 名称为springSecurityFilterChain的@Qualifier,类型为Filter,而不是 FilterChainProxy。 这是因为 WebSecurityConfiguration 中的 springSecurityFilterChain() 方法创建Spring Security 过滤器链,返回类型为Filter 而不是 FilterChainProxy。

    接下来,我们将此对象强制转换为FilterChainProxy并调用getFilterChains()方法:

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

    这是一个示例输出:

    1. class org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter
    2. class org.springframework.security.web.context.SecurityContextPersistenceFilter
    3. class org.springframework.security.web.header.HeaderWriterFilter
    4. class org.springframework.security.web.authentication.logout.LogoutFilter
    5. class org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter
    6. ...

    请注意,从 Spring Security 3.1 开始,  FilterChainProxy 是使用SecurityFilterChain 列表配置的。但是,大多数应用程序只需要一个 SecurityFilterChain。

    5. 重要的 Spring Security 过滤器

    最后,让我们看一下一些重要的安全过滤器:

    • UsernamePasswordAuthenticationFilter : 进程认证,默认响应“/login” URL
    • AnonymousAuthenticationFilter:当 SecurityContextHolder 中没有身份验证对象时,它会创建一个匿名身份验证对象并将其放在那里
    • FilterSecurityInterceptor:访问被拒绝时引发异常
    • ExceptionTranslationFilter : 捕获 Spring Security 异常

    6.结论

    在这篇快速文章中,我们探讨了如何以编程方式和使用日志来查找已注册的 Spring Security 过滤器。

    与往常一样,可以在 GitHub 上找到源代码。

  • 相关阅读:
    MySQL+Java实现父子级联查询
    如何在Mac上清理磁盘空间?
    Linux 环境搭建以及xshell远程连接
    使用HTML制作静态宠物网站——蓝色版爱宠之家(HTML+CSS)
    【原创】java+swing+mysql爱心捐赠管理系统设计与实现
    java面试宝典2019
    2020java面试总结
    数据结构线性表之带头双向循环链表
    是否应该升级到ChatGPT 4.0?深度对比ChatGPT 3.5与4.0的差异
    详解 Go 语言中的 init () 函数
  • 原文地址:https://blog.csdn.net/allway2/article/details/126722864