(自定义)RestAuthenticationProcessingFilter 排序异常

Posted

技术标签:

【中文标题】(自定义)RestAuthenticationProcessingFilter 排序异常【英文标题】:Exception with (Custom) RestAuthenticationProcessingFilter Ordering 【发布时间】:2014-03-25 20:05:53 【问题描述】:

我尝试通过令牌向我的应用添加 Rest 身份验证。 我创建了一个简单的过滤器,什么都不做,打印一条消息:

public class RestAuthenticationProcessingFilter extends GenericFilterBean 

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException 
        System.out.println(arg0);
        // EDIT 25/02/2014
        arg2.doFilter(arg0,arg1);
    

我正在使用带有 JavaConfig 的 Spring 4.0 和 Spring Security 3.2。

我在我的适配器中添加了这个:

@Override
protected void configure(HttpSecurity http) throws Exception 
    /*
     * @RemarqueDev Différence entre permitAll et anonymous : permitAll
     * contient anonymous. Anonymous uniquement pour non connecté
     */
     http.addFilter(new RestAuthenticationProcessingFilter());
     http.csrf().disable().headers().disable();
     http.exceptionHandling().authenticationEntryPoint(new RestAuthenticationEntryPoint());

当我运行码头服务器时,我收到这条消息:

Nested in org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springSecurityFilterChain' defined in class org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public javax.servlet.Filter org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.springSecurityFilterChain() throws java.lang.Exception] threw exception; nested exception is java.lang.IllegalArgumentException: The Filter class my.package.config.RestAuthenticationProcessingFilter does not have a registered order and cannot be added without a specified order. Consider using addFilterBefore or addFilterAfter instead.:
java.lang.IllegalArgumentException: The Filter class com.jle.athleges.config.RestAuthenticationProcessingFilter does not have a registered order and cannot be added without a specified order. Consider using addFilterBefore or addFilterAfter instead.
    at org.springframework.security.config.annotation.web.builders.HttpSecurity.addFilter(HttpSecurity.java:1122)

为什么?

【问题讨论】:

【参考方案1】:

Spring定义了安全过滤器的排序规则,检查构造函数org.springframework.security.config.annotation.web.builders.FilterComparator。当你调用 org.springframework.security.config.annotation.web.builders.HttpSecurity# addFilter 时,它的方法会使用 org.springframework.security.config.annotation.web.builders.FilterComparator 内置的安全过滤器排序规则来检查过滤器是否注册。没有注册的时候会抛出“没有注册的订单”,会被解决。方法是手动提供注册顺序,调用 org.springframework.security.config.annotation.web.builders.HttpSecurity#addFilterBefore 或 org.springframework.security.config.annotation.web.builders.HttpSecurity#addFilterAfter 进行注册内置过滤器之前或之后。请检查 spring 安全内部过滤器排序“https://docs.spring.io/spring-security/site/docs/5.4.2/reference/html5/#servlet-security-filters”。 -- 英文写得不好请见谅。

【讨论】:

【参考方案2】:

addFilter:

添加一个过滤器,该过滤器必须是其中一个过滤器的实例或扩展其中一个过滤器 在安全框架内提供。该方法确保 过滤器的排序是自动处理的。订购 过滤器是:...

您的过滤器不是安全框架内过滤器的实例或扩展。

不过,您可以使用addFilterBeforeaddFilterAfter

例如:

addFilterBefore(new RestAuthenticationProcessingFilter(), BasicAuthenticationFilter.class)

您可以在docs中找到安全过滤器链的顺序。

【讨论】:

它正在工作,但现在,当我进入登录页面时,我收到一个 404 页面未找到。我添加了这段代码:http.addFilterBefore(new RestAuthenticationProcessingFilter(),UsernamePasswordAuthenticationFilter.class 在我的过滤器中添加了一行代码(我在原始帖子中编辑了代码)但它正在与其他非安全页面一起使用非常感谢

以上是关于(自定义)RestAuthenticationProcessingFilter 排序异常的主要内容,如果未能解决你的问题,请参考以下文章

自定义UI 自定义布局

自定义UI 自定义布局

自定义UI 自定义布局

自定义 view - 自定义属性

Springboot+自定义注解+自定义AOP前置增强+自定义异常+自定义异常捕获

Android 自定义View