Spring Security OAuth2 从默认过滤器链中禁用 BasicAuthenticationFilter

She*_*eel 5 java spring spring-security spring-boot spring-security-oauth2

在授权服务器中,由于对客户端 ID 的某些操作,需要添加自定义 BasicAuthenticationFilter。大多数实现与 相同BasicAuthenticationFilter。以下是相同的片段,

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

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

http.addFilterBefore(new CustomBasicAuthenticationFilter(authenticationManager(), authenticationEntryPoint()),
    BasicAuthenticationFilter.class);
Run Code Online (Sandbox Code Playgroud)

这个自定义过滤器工作得很棒,并且用户也成功通过了身份验证。但由于 BasicAuthenticationFilter 仍然存在于链中,该过滤器也会被执行并尝试再次对用户进行身份验证,但由于未操纵客户端凭据而失败。请参阅BasicAuthenticationFilter-GitHub

因此,要从过滤器链中删除/禁用,请BasicAuthenticationFilter遵循此SOQ,建议使用BeanPostProcessor. 但是在 Spring Boot 过滤器链中使用 bean 名称springSecurityFilterChain和 class注册FilterChainProxy。作为FilterChainProxy-GitHub返回不可修改的SecurityFilterChain. 所以接下来不可能改变FilterChainProxybean。

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

使用 Spring Boot 1.5.1 和 Spring Security OAuth2 2.0.12

小智 0

我想你可以使用另一个答案:/sf/answers/1989970811/

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

默认情况下,Spring Boot 会为应用程序上下文中 尚不存在的FilterRegistrationBean每个 创建一个。这允许您通过声明您自己的 . 对于您来说,所需的配置如下所示:FilterFilterRegistrationBeanFilterRegistrationBeanFilterBasicAuthenticationFilter

@Bean
public FilterRegistrationBean registration(BasicAuthenticationFilter filter) {
  FilterRegistrationBean registration = new FilterRegistrationBean(filter);
  registration.setEnabled(false);
  return registration;
}
Run Code Online (Sandbox Code Playgroud)

您可能还对这个 Spring Boot 问题感兴趣 ,其中讨论了如何禁用FilterServletbeans 的自动注册。

  • 来自[Spring文档](http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-add-a-servlet-filter-or-listener-as-spring-bean)。您只能禁用那些使用“FilterRegistrationBean”注册的过滤器/servlet。其中“BasicAuthenticationFilter”未注册相同。[检查](https://github.com/spring-projects/spring-security/blob/a82cab7afdb1fc58830b1c415f1874d36b2c6c92/config/src/main/java/org/springframework/security/config/annotation/web/configurers/HttpBasicConfigurer.java# L208) (4认同)
  • 尝试解决方案的具体错误是“考虑在配置中定义类型为“org.springframework.security.web.authentication.www.BasicAuthenticationFilter”的 bean”。 (4认同)