У меня странная проблема с 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 должен быть действителен уже на этом этапе.
Любые предложения будут высоко оценены.