WebFluxSecurity не добавляет аутентификацию в SecurityContext - PullRequest
6 голосов
/ 24 апреля 2020

У меня странная проблема с Spring Cloud Security с реактивным стеком. Я настроил Spring Cloud Gateway и в то же время сделал его RsourceServer, чтобы в этом случае всем входящим запросам предоставлялась JWT от Firebase. Вот несколько снимков из моей конфигурации.

application.yml Установите JWK и эмитента, чтобы сообщить весенней безопасности, как JWT должны быть проверены.

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          jwk-set-uri: https://www.googleapis.com/service_accounts/v1/jwk/securetoken@system.gserviceaccount.com
          issuer-uri: https://securetoken.google.com/${project_name}

SecurityConfig

    @EnableWebFluxSecurity
    public class SecurityConfig {

      @Bean
      public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
        // @formatter:off
        http
            .csrf().disable()
            .authorizeExchange()
            .pathMatchers("/public").permitAll()
            .anyExchange().authenticated().and()
            .oauth2ResourceServer()
            .jwt();
        return http.build();
        // @formatter:on
      }
    }

и, наконец, контроллер

TestController только для целей тестирования Я создал контроллер для проверки, установлен ли контекст безопасности или нет.

@RestController
@Slf4j
public class TestController {

  @GetMapping("/public")
  public String getPublic() {
    if (SecurityContextHolder.getContext().getAuthentication() != null) {
      throw new IllegalStateException("Public API should not have any AuthContext");
    }

    return "All shiny you got your PUBLIC data!";
  }

  @GetMapping("/private")
  public String getPrivate(@AuthenticationPrincipal Jwt jwt) {
    log.info(jwt.getTokenValue());    //in here jwt present as should be
    if (SecurityContextHolder.getContext().getAuthentication() == null) {
      throw new IllegalStateException("Oops.... Private API should have AuthContext");
    }

    return "All shiny you got your PRIVATE data!";
  }

}

Так что я очень расстроен и надеюсь, что кто-то может помочь мне здесь в соответствии со всеми документами Spring Security, я понял, что мне нужно сохранить контекст безопасности, когда JWT действителен.

Основная цель - уметь использовать ServletBearerExchangeFilterFunction, который пытается получить аутентификацию и токен из него и передать его вниз по течению другим сервисам в WebClient. Тем не менее, это NULL.

Распространение токенов на предъявителя здесь ясно написано, что SecurityContext должен быть действителен уже на этом этапе.

Любые предложения будут высоко оценены.

...