(自定义)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
:
添加一个过滤器,该过滤器必须是其中一个过滤器的实例或扩展其中一个过滤器 在安全框架内提供。该方法确保 过滤器的排序是自动处理的。订购 过滤器是:...
您的过滤器不是安全框架内过滤器的实例或扩展。
不过,您可以使用addFilterBefore
或addFilterAfter
。
例如:
addFilterBefore(new RestAuthenticationProcessingFilter(), BasicAuthenticationFilter.class)
您可以在docs中找到安全过滤器链的顺序。
【讨论】:
它正在工作,但现在,当我进入登录页面时,我收到一个 404 页面未找到。我添加了这段代码:http.addFilterBefore(new RestAuthenticationProcessingFilter(),UsernamePasswordAuthenticationFilter.class
在我的过滤器中添加了一行代码(我在原始帖子中编辑了代码)但它正在与其他非安全页面一起使用非常感谢以上是关于(自定义)RestAuthenticationProcessingFilter 排序异常的主要内容,如果未能解决你的问题,请参考以下文章