如何在spring webflux安全中通过绕过选项请求?

Posted

技术标签:

【中文标题】如何在spring webflux安全中通过绕过选项请求?【英文标题】:How to pass bypass Options request in spring webflux security? 【发布时间】:2021-11-03 14:11:53 【问题描述】:

我创建了一个 spring webflux 安全类来启用自定义身份验证和授权过滤器的安全性。

  public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) 
    log.debug("Configuring tenant web security");

    return http
        .cors(Customizer.withDefaults())
        .csrf().disable()
        .authorizeExchange()
        .pathMatchers(HttpMethod.OPTIONS, "/**").permitAll()
        .pathMatchers(new String[]"/api/demo").permitAll()
        .anyExchange().authenticated()
        .and()
        .addFilterAt(authenticationWebFilter(), SecurityWebFiltersOrder.AUTHENTICATION)
        .addFilterAt(authorizationWebFilter(), SecurityWebFiltersOrder.AUTHORIZATION)
        .build();
  

这里的 Authenticaion 过滤器是:

   /**
   * Method to get the instance of @link AuthenticationWebFilter.
   *
   * @return @link AuthenticationWebFilter instance.
   */
  private AuthenticationWebFilter authenticationWebFilter() 
    AuthenticationWebFilter authenticationWebFilter = new AuthenticationWebFilter(
        customAuthenticationManager);
    authenticationWebFilter.setServerAuthenticationConverter(customAutenticationConverter);
    NegatedServerWebExchangeMatcher negateWhiteList = new NegatedServerWebExchangeMatcher(
        ServerWebExchangeMatchers.pathMatchers(new String[]"/api/demo"));
    authenticationWebFilter.setRequiresAuthenticationMatcher(negateWhiteList);
    return authenticationWebFilter;
  

授权网页过滤器是:

 private AuthorizationWebFilter authorizationWebFilter() 
    return new AuthorizationWebFilter(customAuthorizationManager);
  

Cors 配置是:-

  @Bean
  public CorsConfigurationSource corsConfigurationSource() 
    CorsConfiguration corsConfiguration = new CorsConfiguration();
    corsConfiguration.addAllowedOrigin("*");
    corsConfiguration.addAllowedHeader("*");
    corsConfiguration.addAllowedMethod(HttpMethod.OPTIONS);
    UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
    corsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
    return corsConfigurationSource;
  

现在,当我发出 OPTIONS 请求时,它仍会转到我在上面在过滤器中注册的 customAuthenticationManager

我怎样才能绕过这个?

【问题讨论】:

这是因为当您添加自定义过滤器时,所有赌注都已关闭。当您所做的只是编写所有自定义内容时,为什么还要使用安全框架? (我可能会添加一个不好的做法) 需要自定义过滤器,因为对于每个请求,它们都是一个标头 x-auth-token,然后我将其用于我的身份验证服务器来验证令牌,然后仅通过身份验证。 为什么不自定义框架为您提供的 Spring Security 中已经默认实现的过滤器?正如我所说,自定义安全性是不好的做法,当使用自定义过滤器时,您基本上选择退出框架及其所有功能。 我自定义 AuthenticationWebFilter 只是给它我的自定义 AuthenticationManagerServerAuthenticationConverter 不,您不是,您正在创建一个全新的 AuthenticationWebFilter,并在过滤器链中手动设置它。您没有自定义当前过滤器,您应该通过向当前过滤器拾取的上下文提供 @Bean 来实现这一点。 【参考方案1】:

corsConfigurationSource bean 为我工作。我遇到的请求有问题

【讨论】:

请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。

以上是关于如何在spring webflux安全中通过绕过选项请求?的主要内容,如果未能解决你的问题,请参考以下文章

Spirng Cloud Gateway中通过Spring security + WebFlux 实现权限认证

如何在Spring WebFlux中记录请求和响应主体

一文带您搞清什么是 Spring Boot 2.x WebFlux

Spring Boot中通过CORS解决跨域问题

带有 Spring 安全 webflux 的 Angular 6 被 CORS 阻止

WebFilter bean 在安全的 Spring Boot Webflux 应用程序中调用了两次