spring-boot 相同 URL 的不同身份验证方式

Differents authentication ways on same URLs with spring-boot

我正在开发一个 spring 由注释配置的引导 Web 应用程序项目。我已成功配置 spring-security 以在某些 URL 上添加基本身份验证并在其他一些 URL 上添加 sso。 但实际上我必须修改该行为才能实现此目的:

我所有的 URL 都受到两种身份验证方法的保护,为了确定使用方式我必须阅读请求的 headers :如果有 ppauth 令牌,我会尝试sso 身份验证,如果我有 Authoriation: Basic header 我会尝试 Basic 身份验证。在另一种情况下,身份验证失败。

在spring boot 文档中的例子非常简单,它显示了WebSecurityConfigurerAdapter 的用法,实际上我们可以通过不同的URL 模式而不是像headers 的其他谓词来确定身份验证方法。

有人有想法吗?

做某事总是有不止一种方法。在这种情况下,最简单的方法可能是以这样的方式编写您的 sso 过滤器,如果没有自定义 header,它会继续链,并将其放在 之前 基本身份验证筛选。然后,如果您的自定义过滤器跳过请求,它将由基本身份验证处理。

终于找到了解决这个问题的方法,所以我会简单地分享一下:

所以我们有多种身份验证方式,在扩展 AbstractPreAuthenticatedProcessingFilter 的几个 class 中进行了描述。 (所有这些都不会添加到过滤器链中)

最重要的是我们得到了一个 MultiAuthModeSecurityFilter,这个 class 将被添加到应用程序的过滤器链中:

WebSecurityConfigurerAdapter

configure 方法中
http.addFilterBefore(new MultiAuthModeSecurityFilter(
                FirstSecurityFilter(),
                SecondSecurityFilter(),
                ThirdSecurityFilter()), RequestCacheAwareFilter.class);

所以 MultiAuthModeSecurityFilter 知道我们所有的安全策略,并将通过执行以下操作将请求分派到正确的过滤器:

    @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            /*some actions to define the right authMethod to use*/
            switch (authMethod) {
                case FIRST:
                    firstFilter.doFilter(servletRequest, servletResponse, filterChain);
                    break;
                case SECOND:
                    secondFilter.doFilter(servletRequest, servletResponse, filterChain);
                    break;
                case THIRD:
                    thirdFilter.doFilter(servletRequest, servletResponse, filterChain);
                    break;
                default:
                    /* throws exception */ break;
            }
        }

希望对您有所帮助!