gpt4 book ai didi

java - 如何在所有 HttpSecurity 配置器中添加过滤器?

转载 作者:行者123 更新时间:2023-12-02 09:10:59 27 4
gpt4 key购买 nike

作为一名解决方案架构师,我想为当前应用程序上下文中的所有 Spring Security 过滤器链添加一个过滤器,无论它们是如何或在何处声明的,这样忘记添加它的开发人员就不会错过这个过滤器.

假设不同的开发人员添加了一些自定义安全性来解决特定于其过滤器的不同逻辑问题。可以有 1 个或多个 WebSecurityConfigurerAdapter

public class DeveloperWebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.mvcMatcher("/forgottenFilter/**")
//.addFilter(reallyImportantFilter)
.authorizeRequests()
.anyRequest().access("developerDefinedCriteria");
}
}

我自己可以声明一个 WebSecurityConfigurerAdapter 来向 HttpSecurity 添加一个过滤器,但这被视为一个单独的包罗万象的过滤器链。

public class FrameworkWebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
Filter reallyImportantFilter;

@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilter(reallyImportantFilter);
}
}

实际上,我并没有将我的过滤器添加到开发者链中,而是创建了一个完全独立的链,该链会干扰其他过滤器链的映射。

DefaultSecurityFilterChain INFO: Creating filter chain: any request, [... ReallyImportantFilter@77ce8bc5 ...]

DefaultSecurityFilterChain INFO: Creating filter chain: Mvc [pattern='/forgottenFilter/**'] [...]

有没有开箱即用的方法来配置这样的过滤器?如果没有,可以应用什么模式来避免过滤器被遗忘?

最佳答案

我想到了WebSecurityConfigurerAdapter的一个功能。 javadoc状态:

Will automatically apply the result of looking up AbstractHttpConfigurer from SpringFactoriesLoader to allow developers to extend the defaults. To do this, you must create a class that extends AbstractHttpConfigurer and then create a file in the classpath at "META-INF/spring.factories" that looks something like:

org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer = sample.MyClassThatExtendsAbstractHttpConfigurer

例如,在您的情况下,您可以创建自己的 AbstractHttpConfigurer 实现,在其中添加非常重要的过滤器:

package sample;
// ...
public class CustomSecurityConfigurer<H extends HttpSecurityBuilder<H>>
extends AbstractHttpConfigurer<CustomSecurityConfigurer<H>, H> {

@Override
public void init(H http) { }

@Override
public void configure(H http) {
// add your own filter... for example:
http.addFilterAfter(new ImportantFilter(), LogoutFilter.class);
}
}

...并将此行添加到 META-INF 文件夹中的 spring.factories 中:

org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer=sample.CustomSecurityConfigurer

WebSecurityConfigurerAdapter 中,此配置器被添加到配置器“列表”中(例如 CsrfConfigurerLogoutConfigurer...),这将构建HttpSecurity,并最终构建相应的过滤器链。

如果您有多个 WebSecurityConfigurerAdapter,每个都将应用此配置器,因此您最终将配置从 HttpSecurity 创建的每个过滤器链。

关于java - 如何在所有 HttpSecurity 配置器中添加过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59418500/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com