首页 文章

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

提问于
浏览
2

在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 . 但是在Spring Boot过滤器链中注册了bean名称 springSecurityFilterChain 和类 FilterChainProxy . 作为FilterChainProxy-GitHub返回 SecurityFilterChain 的不可修改列表 . 所以它的下一个不可能改变 FilterChainProxy bean .

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

使用Spring Boot 1.5.1和Spring Security OAuth2 2.0.12

1 回答

  • 1

    我想你可以用另外一个答案:https://stackoverflow.com/a/28428154/2648577

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

    默认情况下,Spring Boot会为应用程序上下文中的每个Filter创建一个FilterRegistrationBean,而FilterRegistrationBean尚不存在 . 这允许您通过为Filter声明自己的FilterRegistrationBean来控制注册过程,包括禁用注册 . 对于BasicAuthenticationFilter,所需的配置如下所示:@Bean
    public FilterRegistrationBean registration(BasicAuthenticationFilter filter){
    FilterRegistrationBean registration = new FilterRegistrationBean(filter);
    registration.setEnabled(假);
    退货登记;
    }
    您可能还对此Spring Boot问题感兴趣,该问题讨论了如何禁用Filter和Servlet bean的自动注册 .

相关问题