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