目前我面临着允许用户使用 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 很难获得。也许您有想法或需要查找一些资源。
一种选择可能是使
apiKeyAuthFilter
延伸 AbstractAuthenticationProcessingFilter
并提供合适的 RequestHeaderRequestMatcher
。如果标头存在,则这应该仅应用您在 attemptAuthentication
中添加的任何身份验证。
public class ApiKeyAuthFilter extends AbstractAuthenticationProcessingFilter {
public ApiKeyAuthFilter() {
super(new RequestHeaderRequestMatcher("X-API-KEY"));
}