gpt4 book ai didi

java - PreAuthenticatedProcessingFilter 位置的编程配置

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:07:15 27 4
gpt4 key购买 nike

查看the Spring documentation for pre-authentication scenarios , 对于 AbstractPreAuthenticatedProcessingFilter 的实现似乎有一个特定的位置当使用 XML 配置时,即

<security:http>
<!-- Additional http configuration omitted -->
<security:custom-filter position="PRE_AUTH_FILTER" ref="refToMyPreAuthFilter" />
</security:http>

如何使用编程配置实现相同的效果?据推测,应在 ExceptionTranslationFilter 之前调用用于处理预身份验证的过滤器。 ?但是,使用类似

@Configuration
@EnableWebSecurity
public class MySecurityConfiguration extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {

http
.addFilterBefore(new MyPreAuthFilter(), ExceptionTranslationFilter.class)
// ... additional configuration omitted
}
}

似乎会导致过滤器根本不被调用?仅使用

http.addFilter(new MyPreAuthFilter())

似乎有效,但我不确定过滤器是否添加到正确的位置(考虑到 XML 示例配置使用此过滤器的特定位置这一事实)?

查看Filter Ordering in the Spring documentation , 使用

http.addFilterBefore(new MyPreAuthFilter(), ConcurrentSessionFilter.class) 

似乎是个好地方并且在测试中有效。

任何人都可以确认这是此类过滤器的正确位置(或者说出正确的位置)吗?

最佳答案

经过多浏览,我找到了以下答案,希望对某些人有用。

TL;DR 仅使用 http.addFilter(new MyPreAuthFilter) 是正确的,因为 AbstractPreAuthenticatedProcessingFilter 的子类的正确顺序是自动建立的.

所以,这里是完整的解释:查看addFilter()HttpSecurity ,我们看到它做了以下事情

public HttpSecurity addFilter(Filter filter) {
Class<? extends Filter> filterClass = filter.getClass();
if (!comparitor.isRegistered(filterClass)) {
throw new IllegalArgumentException(...); // Complain about missing order
}
this.filters.add(filter);
return this;
}

首先,请注意以下两个事实:

  1. HttpSecurity::addFilterBeforeHttpSecurity::addFilterAfter例如,在第一次注册给定的过滤器类 comparitor 之后,实际上调用 HttpSecurity::addFilter

    public HttpSecurity addFilterAfter(Filter filter, 
    Class<? extends Filter> afterFilter) {
    comparitor.registerAfter(filter.getClass(), afterFilter);
    return addFilter(filter);
    }
  2. FilterComparitor::isRegistered不仅检查给定的类,还检查父类(super class)。

现在,请记住 http.addFilter(new MyPreAuthFilter()) where (class MyPreAuthFilter extends AbstractPreAuthenticatedProcessingFilter { ... }) 没有抛出异常。这意味着 AbstractPreAuthenticatedProcessingFilter(或其父类(super class)之一)必须已经在 comparitor 中注册。而且,事实上,看着 constructor of FilterComparator我们看到建立了以下顺序:

...
final int STEP = 100;
...
int order = 100;
put(ChannelProcessingFilter.class, order);
order += STEP;
put(ConcurrentSessionFilter.class, order);
order += STEP;
... // more filters
put(X509AuthenticationFilter.class, order);
order += STEP;
put(AbstractPreAuthenticatedProcessingFilter.class, order);
order += STEP;
...
put(UsernamePasswordAuthenticationFilter.class, order);
order += STEP;
...
put(ExceptionTranslationFilter.class, order);
order += STEP;
put(FilterSecurityInterceptor.class, order);
...

因此,对 AbstractPreAuthenticatedProcessingFilter 的子类使用 HttpSecurity::addFilter 是正确的答案。

关于java - PreAuthenticatedProcessingFilter 位置的编程配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34654503/

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