身份验证过滤器不适用于 Spring Boot

Posted

技术标签:

【中文标题】身份验证过滤器不适用于 Spring Boot【英文标题】:Authentication Filter not working with SpringBoot 【发布时间】:2015-11-17 18:58:27 【问题描述】:

我正在使用 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 实现了Filter接口的方法。

 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 运行应用程序时,它运行良好。但是当我从中创建一个战争并在 tomcat 中运行它时,既不会为请求调用 init 也不会调用 doFilter 。因此,它未经授权返回。

accessFilter 也是如此。

有人知道这种行为背后的原因吗?或者我需要进行哪些更改才能让我的应用在 tomcat 上运行?

【问题讨论】:

我会说因为你的整个安全设置是错误的。我怀疑是因为它是Filter,并且您在嵌入式模式下运行时将其注册为@Bean,过滤器被servlet容器而不是Spring Security调用。我怀疑后者是否有效。 是的@M.Deinum,我知道这可能不是最好的方法。你能建议我,让这个更好吗? 对于初学者来说,删除 @Named 注释,这样它就不会被拾取并添加到正常的过滤器链中。如果你有一个 @Bean 方法来创建过滤器,那么也删除它。只需创建一个实例并将其注册到 spring 安全过滤器链。我怀疑它在这两种情况下都会开始失败...... 【参考方案1】:

您使用的 Tomcat 版本是什么?

我不确定,但试试这个:

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

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

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

.

【讨论】:

感谢@Jorge,这可能行不通我已经在使用@Named 注释。我正在使用带有 Java 8 的 tomcat 8。 @biraj 使用 SpringBootServletInitializer? :是的,我正在使用它,否则不会创建可部署的战争。 我编辑了,但我没有更多的想法......对不起。能否给出更具体的代码?

以上是关于身份验证过滤器不适用于 Spring Boot的主要内容,如果未能解决你的问题,请参考以下文章

通过注释的 Spring 授权不适用于自定义身份验证

Spring Security with Spring Boot:使用过滤器时允许未经身份验证的用户访问特定端点

Spring 安全忽略 url 不适用于我们的安全忽略方法 [重复]

在 Spring Boot 2 上实现基于过滤器的 JWT 身份验证与 OAuth2 JWT 身份验证

使用摘要过滤器的 Spring-boot 摘要身份验证失败

在 Spring Boot 中成功身份验证后未生成 JWT 令牌