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

<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的子类建立正确的顺序.

因此,这是完整的解释:查看HttpSecurity的addFilter(),我们看到它可以完成以下操作

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;
    }

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

>例如,首先注册给定的过滤器类比较器后,HttpSecurity::addFilterBeforeHttpSecurity::addFilterAfter实际上会调用HttpSecurity :: addFilter

public HttpSecurity addFilterAfter(Filter filter, 
        Class<? extends Filter> afterFilter) {
    comparitor.registerAfter(filter.getClass(), afterFilter);
    return addFilter(filter);
}

> FilterComparitor::isRegistered不仅检查给定的类,还检查超类.

现在,请记住http.addFilter(new MyPreAuthFilter())在哪里(类MyPreAuthFilter扩展了AbstractPreAuthenticatedProcessingFilter {…})可以正常工作而不会引发异常.这意味着AbstractPreAuthenticatedProcessingFilter(或其超类之一)必须已经在比较器中注册.而且,实际上,查看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);
...

因此,将HttpSecurity :: addFilter用于AbstractPreAuthenticatedProcessingFilter的子类是正确的答案.

点击查看更多相关文章

转载注明原文:java-PreAuthenticatedProcessingFilter位置的程序配置 - 乐贴网