Java 身份验证筛选器不适用于SpringBoot

Java 身份验证筛选器不适用于SpringBoot,java,spring,spring-mvc,tomcat,spring-boot,Java,Spring,Spring Mvc,Tomcat,Spring Boot,我正在开发一个具有Spring Boot+Spring security的应用程序。为此,我将过滤器定义为 @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/authtoken").permitAll() .antMatchers

我正在开发一个具有Spring Boot+Spring security的应用程序。为此,我将过滤器定义为

 @Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
        .authorizeRequests()
        .antMatchers("/authtoken").permitAll()
        .antMatchers("/authenticate**").permitAll()
        .antMatchers("/authfailure").permitAll()
        .antMatchers("/**").authenticated()
        .and()
            .addFilterBefore(tokenFilter, UsernamePasswordAuthenticationFilter.class)
            .addFilterAfter(accessFilter, UsernamePasswordAuthenticationFilter.class)
            .authenticationProvider(tokenAuthenticationProvider)
            .antMatcher("/**").exceptionHandling().authenticationEntryPoint(authenticationEntryPoint);

}
其中,tokenFilter是AuthTokenFilter的实例(该类具有用于身份验证的代码,并使用@inject注入)

AuthTokenFilter将筛选器接口的方法实现为

 public class AuthTokenFilter implements Filter {
 ServletContext sc ;
 @Override
  public void init(FilterConfig fc) throws ServletException {
    sc = fc.getServletContext();
   }

  @Override
   public void doFilter(ServletRequest req, ServletResponse res, FilterChain  fc) throws IOException, ServletException {
 ------- 
 ------- 
 }
我的问题是,当我使用SpringBoot运行应用程序时,它运行良好。但是当我用它创建一个war并在tomcat中运行它时,不会为请求调用init或doFilter。因此,它未经授权返回

accessFilter也是如此


有人知道这种行为背后的原因吗?或者我需要做什么更改才能让我的应用程序在tomcat上运行?

您使用的是什么tomcat版本

我不确定,但试试这个:

在类AuthTokenFilter的声明中,添加anotation@Component

我有一个带过滤器的项目,只写:

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class SimpleCORSFilter implements Filter ...

.

您使用的Tomcat版本是什么

我不确定,但试试这个:

在类AuthTokenFilter的声明中,添加anotation@Component

我有一个带过滤器的项目,只写:

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class SimpleCORSFilter implements Filter ...

.

我会说,因为您的整个安全设置都是错误的。我怀疑,由于它是一个
过滤器
,并且在嵌入式模式下运行时,您将其注册为
@Bean
,因此该过滤器由servlet容器调用,而不是由Spring Security调用。我怀疑后者是否有效。是的@M.Deinum,我知道这可能不是最好的方法。你能给我一些建议吗?对于初学者来说,删除
@Named
注释,这样它就不会被拾取并添加到正常的过滤器链中。如果您有一个
@Bean
方法来创建过滤器,那么也将其删除。只需创建一个实例并将其注册到spring安全过滤器链。我怀疑它在这两种情况下都会失败……我会说,因为您的整个安全设置都是错误的。我怀疑,由于它是一个
过滤器
,并且在嵌入式模式下运行时,您将其注册为
@Bean
,因此该过滤器由servlet容器调用,而不是由Spring Security调用。我怀疑后者是否有效。是的@M.Deinum,我知道这可能不是最好的方法。你能给我一些建议吗?对于初学者来说,删除
@Named
注释,这样它就不会被拾取并添加到正常的过滤器链中。如果您有一个
@Bean
方法来创建过滤器,那么也将其删除。只需创建一个实例并将其注册到spring安全过滤器链。我怀疑它在这两种情况下都会失败……谢谢@Jorge,这可能不起作用,我已经在使用@Named annotation了。我将tomcat 8与Java 8一起使用。@biraj使用SpringBootServletializer?:是的,我正在使用它,否则不会创建可部署的战争。我编辑了,但我没有更多的想法。。。很抱歉你能给出更具体的代码吗?谢谢@Jorge,这可能不行,我已经在使用@Named注解了。我将tomcat 8与Java 8一起使用。@biraj使用SpringBootServletializer?:是的,我正在使用它,否则不会创建可部署的战争。我编辑了,但我没有更多的想法。。。很抱歉你能给出更具体的代码吗?