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

Spring Security Combining oauth2 and api key filter

提问人:Twin322 提问时间:8/23/2023 更新时间:8/24/2023 访问量:140

问:

目前,我面临的问题是允许用户使用 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-security

评论

1赞 grekier 8/24/2023
请提供 apiKeyAuthFilter 的代码

答:

0赞 Chris Olive 8/24/2023 #1

一种选择可能是进行扩展并提供合适的 .然后,如果标头存在,则仅应用已添加的任何身份验证。apiKeyAuthFilterAbstractAuthenticationProcessingFilterRequestHeaderRequestMatcherattemptAuthentication

public class ApiKeyAuthFilter extends AbstractAuthenticationProcessingFilter {

  public ApiKeyAuthFilter() {
    super(new RequestHeaderRequestMatcher("X-API-KEY"));
  }