Spring Security OAuth2从默认筛选器链中禁用BasicAuthenticationFilter

时间:2017-02-17 12:18:08

标签: java spring spring-boot spring-security spring-security-oauth2

在Authorization Server中,由于对客户端ID的某些操作,需要添加自定义BasicAuthenticationFilter。大部分实现与BasicAuthenticationFilter相同。以下是相同的片段,

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {
    ...
    ...
    String username = someDecoder(tokens[0]); // Kind of something
    ...
    ...
}

我的自定义过滤器放在过滤器链中的BasicAuthenticationFilter之前。

http.addFilterBefore(new CustomBasicAuthenticationFilter(authenticationManager(), authenticationEntryPoint()),
    BasicAuthenticationFilter.class);

此自定义过滤器工作非常棒,用户也可以成功进行身份验证。但由于BasicAuthenticationFilter仍然存在于链中,此过滤器也会被执行并尝试再次对用户进行身份验证,但由于未操作客户端凭据而失败。见BasicAuthenticationFilter-GitHub

所以要从过滤器链中删除/禁用BasicAuthenticationFilter,然后按SOQ建议使用BeanPostProcessor。但是在使用bean名称 springSecurityFilterChain 和类 FilterChainProxy 注册的Spring Boot过滤器链中。当FilterChainProxy-GitHub返回SecurityFilterChain的不可修改列表时。所以下一个不可能改变FilterChainProxy bean。

那么如何实现从Spring Security Filter链中删除/禁用BasicAuthenticationFilter或任何其他过滤器的相同或任何其他方式。

使用Spring Boot 1.5.1和Spring Security OAuth2 2.0.12

1 个答案:

答案 0 :(得分:1)

我认为您可以使用其他答案:https://stackoverflow.com/a/28428154/2648577

---->>>这是复制/粘贴(更改过滤器名称)。

  

默认情况下,Spring Boot会为每个人创建一个FilterRegistrationBean   在应用程序上下文中的Filter   FilterRegistrationBean已经存在。这允许你   控制注册过程,包括禁用   注册,声明自己的FilterRegistrationBean   Filter。对于您需要的BasicAuthenticationFilter   配置看起来像这样:

     
@Bean
public FilterRegistrationBean registration(BasicAuthenticationFilter filter) {
  FilterRegistrationBean registration = new FilterRegistrationBean(filter);
  registration.setEnabled(false);
  return registration;
}
     

您可能也对this Spring Boot issue感兴趣   讨论了如何禁用Filter的自动注册   和Servlet豆。