Spring Security 结合 oauth2 和 api 密钥过滤器

问题描述 投票:0回答:1

目前我面临着允许用户使用 X-API-KEY 标头 oauth2 jwt 令牌授权 REST Api 的问题。

当前的安全配置如下所示:

@Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

        http.addFilterBefore(apiKeyAuthFilter, BasicAuthenticationFilter.class);

        http.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .csrf(AbstractHttpConfigurer::disable)
                .cors(AbstractHttpConfigurer::disable)
                .httpBasic(AbstractHttpConfigurer::disable)
                .formLogin(AbstractHttpConfigurer::disable)
                .headers(h -> h.httpStrictTransportSecurity(c -> c.requestMatcher(AnyRequestMatcher.INSTANCE)));

        http.oauth2ResourceServer(server -> server.jwt(jwt ->
                        jwt.jwtAuthenticationConverter(
                                jwtGrantedAuthoritiesConverter()).decoder(jwtDecoder())
                )
        );

        return http.build();
    }

我遇到的问题是,即使我提供了有效的 jwt 并且 oauth2ResourceServer 很好,它仍然会触发 apiKeyFilter,然后由于未设置标头而失败。

我读了很多有关多重身份验证的内容,但 Spring Security 很难获得。也许您有想法或需要查找一些资源。

java spring spring-boot security spring-security
1个回答
0
投票

一种选择可能是使

apiKeyAuthFilter
延伸
AbstractAuthenticationProcessingFilter
并提供合适的
RequestHeaderRequestMatcher
。如果标头存在,则这应该仅应用您在
attemptAuthentication
中添加的任何身份验证。

public class ApiKeyAuthFilter extends AbstractAuthenticationProcessingFilter {

  public ApiKeyAuthFilter() {
    super(new RequestHeaderRequestMatcher("X-API-KEY"));
  }
© www.soinside.com 2019 - 2024. All rights reserved.