插入Spring-Security过滤器显然会破坏过滤器链

时间:2020-06-25 07:29:20

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

在我的Spring-Boot应用程序(资源服务器)中,在某些情况下,我想跳过对Authorization Server的令牌检查。为此,我在Spring-Security过滤器链的SecurityContextPersistenceFilter之前插入了一个过滤器。

理想情况下,我希望在不满足条件的情况下不要更改(称为授权服务器,根据响应设置身份验证)。我发现,当满足条件时安全上下文将被覆盖,而过滤器什么也不做时会出现问题:在这种情况下,OAuth2AuthenticationProcessingFilter根本不会出现在链中,而我留下了“匿名用户”。

这是我的自定义过滤器的外观:

public class SessionFilter extends GenericFilterBean {

    @Override
    public void doFilter(
        ServletRequest servletRequest,
        ServletResponse servletResponse,
        FilterChain filterChain
    ) throws IOException, ServletException {

        HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
        String authorizationHeader = httpRequest.getHeader(HttpHeaders.AUTHORIZATION);
        
        if (authorizationHeader != null && meetsCondition(authorizationHeader)) {
            SecurityContext sc = SecurityContextHolder.getContext();
            sc.setAuthentication(new CustomAuthentication(authorizationHeader));
            httpRequest.getSession(true)
                    .setAttribute(SPRING_SECURITY_CONTEXT_KEY, sc);
        }

        filterChain.doFilter(servletRequest, servletResponse);
    }
}

使用WebSecurityConfigurerAdapter将其扔到链中:

        http  //...
                .and().csrf().disable()
                .addFilterBefore(
                        new SessionFilter(),
                        SecurityContextPersistenceFilter.class
                 );

有没有一种方法可以实现使用此方法的目标?我正在将Spring-Boot 1.4.7与Java 8和Spring-Security 4.1.4一起使用(由于该问题之外的原因,无法进行升级)。

我基于我的代码/理解的来源:

2 个答案:

答案 0 :(得分:0)

对于您的过滤器,我没有看到任何特别独特或奇怪的东西,因此问题可能不在于过滤器本身,而在于其余的配置。我只有几点笔记

  1. 在放入此自定义类之前,您是否已确认OAuth2过滤器工作正常?您是手动添加它还是使用@EnableResourceServer注释添加它?

  2. 我注意到您使用GenericFilterBean并手动添加它。我认为Spring Security会自动扫描GenericFilterBeans并将其添加到过滤器链中,以便它可能在您的链中两次出现。

答案 1 :(得分:-1)

我认为问题在于您在WebSecurityConfigurerAdapter中注入会话过滤器的方式。

Bareword "something" not allowed while "strict subs" in use at /tmp/heredoc2.pl line 6.
syntax error at /tmp/heredoc2.pl line 9, near "FOO
    close"
Execution of /tmp/heredoc2.pl aborted due to compilation errors.

请参阅此答案以更好地了解如何使用自动接线。 How does autowiring work in Spring?

如果有帮助,您可以尝试使用此代码块。

http  //...
                .and().csrf().disable()
                .addFilterBefore(
                        new SessionFilter(), // The session filter here is never set in the application context the way you want it to.
                        SecurityContextPersistenceFilter.class
                 );
相关问题