身份验证过滤器不适用于 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 Security with Spring Boot:使用过滤器时允许未经身份验证的用户访问特定端点
Spring 安全忽略 url 不适用于我们的安全忽略方法 [重复]