JWT 身份验证回退到相同路径的 SAML2

Posted

技术标签:

【中文标题】JWT 身份验证回退到相同路径的 SAML2【英文标题】:JWT authentication with fallback to SAML2 for the same path 【发布时间】:2020-08-08 04:39:29 【问题描述】:

我在我的一个 Spring Boot 应用程序中使用 spring-security-saml2-service-provider 进行身份验证,我在另一个 Spring Boot 应用程序中使用自定义 JwtAuthorizationFilter(通过 http Authentication 标头)。

它们都可以独立工作。

现在我需要编写一个同时使用它们的 Spring Boot 应用程序。如果 JWT 令牌可用(身份验证标头),则使用 JwtAuthorizationFilter,否则使用 saml2Login

SAML2 配置如下所示:(没有过滤器,只有saml2Login

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http
            .csrf()
            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and()
            .antMatcher("/**").authorizeRequests()
            .antMatchers("/saml2/service-provider-metadata/**").permitAll()
            .antMatchers("/**").authenticated().and()

            // use SAML2
            .saml2Login()
            .addObjectPostProcessor(new ObjectPostProcessor<OpenSamlAuthenticationProvider>() 
                public <O extends OpenSamlAuthenticationProvider> O postProcess(O samlAuthProvider) 
                    samlAuthProvider.setAuthoritiesExtractor(authoritiesExtractor());
                    samlAuthProvider.setAuthoritiesMapper(authoritiesMapper());
                    return samlAuthProvider;
                
            )
        ;
    

JWT 配置如下所示:

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http
            .csrf()
            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and()
            .antMatcher("/**").authorizeRequests()
            .antMatchers("/**").authenticated().and()

            // use JWT
            .addFilter(new JwtAuthorizationFilter(authenticationManager(), jwtUtil))
        ;
    

我想我需要JwtOrSaml2AuthenticationFilter 之类的东西,但不知道该怎么做。

【问题讨论】:

***.com/questions/9303502/… 可能你想指定几个提供者。它们将按相同的顺序进行检查。 我将如何使用上面的 java 配置来做到这一点?在一种情况下,我有 saml2Login(),而在另一种情况下,我有 Filter。 您可以定义这两种配置并使用@Order 注释对其进行排序。 baeldung.com/spring-security-multiple-entry-points 我已经在不同的位置使用多个@Order。你确定它可以用于同一个位置吗?我希望它尽快返回 403,因为第一个配置拒绝访问? 应该工作没有自己尝试过,但是如果您注册了 2 个不同的提供商,他们应该按顺序链接和工作。 baeldung.com/spring-security-multiple-auth-providers. 【参考方案1】:

解决办法是

    使用@Order 和复制配置

    在 addFilter 之前设置一个基于 header 的 requestMatcher

    @EnableWebSecurity
    public class SecurityConfiguration 
        @Order(100) // lower number = higher priority
        @Configuration
        @RequiredArgsConstructor
        public static class AppSecurityJWT extends WebSecurityConfigurerAdapter 
            final JWTUtil jwtUtil;
    
            @Override
            protected void configure(HttpSecurity http) throws Exception 
                http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and()
                    .antMatcher("/**").authorizeRequests()
                    .antMatchers("/saml2/service-provider-metadata/**", "/idm-app/**").permitAll()
                    .antMatchers("/**").authenticated().and()
    
                    // This configuration will only be active if the Authorization header is present in the request
                    .requestMatcher(new RequestHeaderRequestMatcher("Authorization")).addFilter(new JwtAuthorizationFilter(authenticationManager(), jwtUtil))
                ;
            
        
    
        @Order(101)
        @Configuration
        @RequiredArgsConstructor
        public static class AppSecuritySAML2 extends WebSecurityConfigurerAdapter 
            @Override
            protected void configure(HttpSecurity http) throws Exception 
                http
                    .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and()
                    .antMatcher("/**").authorizeRequests()
                    .antMatchers("/saml2/service-provider-metadata/**", "/idm-app/**").permitAll()
                    .antMatchers("/**").authenticated().and()
    
                    // This whole configuration will only be active, if the previous (100) didn't match
                    .saml2Login()
                    //...
            ;
        
    
    

【讨论】:

以上是关于JWT 身份验证回退到相同路径的 SAML2的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net Core HTTP.SYS Windows 身份验证回退到 NTLM 而不是 Kerberos

是否可以在单个应用程序中拥有 SAML 2.0 身份验证和 JWT 身份验证?

使用 Node.js 和 SPA 进行 SAML2.0 身份验证

使用身份验证回退配置 Crowd Spring Security

将 java webapp 转换为使用 SAML2 身份验证

基于 SAML 断言授权的 SAML2 身份验证