При создании Request interceptor SecurityContextHolder.getContext().getAuthentication() возвращает null
Есть цепочка микросервисов взаимодействующая через eureka и gateway-api.
Внутри нее передается токен для аутентификации. Но внутри микросервиса №1 я с помощью Feign вызываю
микросервис №2. Для того чтобы передать в №2 токен, я создаю бин RequestInterceptor.
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
@Bean
public RequestInterceptor requestTokenBearerInterceptor() {
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate requestTemplate) {
System.out.println("In the request interceptor");
System.out.println(SecurityContextHolder.getContext());
System.out.println(SecurityContextHolder.getContext().getAuthentication());
JwtAuthenticationToken token = (JwtAuthenticationToken) SecurityContextHolder
.getContext().getAuthentication();
requestTemplate.header("Authorization", "Bearer" + token.getToken().getTokenValue());
}
};
}
}
Но почему то при посылке запроса через постман в бине перехватчика значение SecurityContextHolder.getContext().getAuthentication() возвращает null.
При проверке в контроллере видно что токен доходит
@RestController
@RequestMapping("/api/order")
@Slf4j
@RequiredArgsConstructor
public class OrderController {
private final OrderRepository orderRepository;
private final InventoryClient inventoryClient;
@PostMapping
public String placeOrder(@RequestBody OrderDto orderDto, @RequestHeader("Authorization") String authHeader) {
System.out.println("In the order controller");
System.out.println("Authorization:" + authHeader);
boolean isAllProductsInStock = orderDto.getOrderLineItems().stream()
.allMatch(orderLineItem -> inventoryClient.checkStock(orderLineItem.getScuCode()));
if (isAllProductsInStock) {
Order order = new Order();
order.setOrderLineItems(orderDto.getOrderLineItems());
order.setOrderNumber(UUID.randomUUID().toString());
orderRepository.save(order);
return "Order place successfully";
}
return "Please try again";
}
}
Вывод токена в консоль : Authorization:Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJ5cXNCUnktOVFBZ0pJZmFxa2VybVNVMEQ0UGVCalFpRTNtNF9RRnVjMlowIn0.eyJleHAiOjE2NjA4OTgwOTUsImlhdCI6MTY2MDg5Nzc5NSwiYXV0aF90aW1lIjoxNjYwODk1MjMyLCJqdGkiOiI1Zjk3MTk3NC05YTA1LTRlMDAtOGNmYy1lOTdiYTRiNmZhN2IiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgxODAvYXV0aC9yZWFsbXMvbWljcm9zZXJ2aWNlLXByb2plY3QtcmVhbG0iLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiOTRhYjkwMWMtMWUzMS00MDVlLTkyNWUtNDUxYzIxZTgwMDhjIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoic3ByaW5nLWNsb3VkLWdhdGV3YXktY2xpZW50Iiwic2Vzc2lvbl9zdGF0ZSI6IjMxMDM5YTI4LWFmZjktNGZmYy05MGVjLTIzNmQxYTk1NzI5OSIsImFjciI6IjAiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiIsImRlZmF1bHQtcm9sZXMtbWljcm9zZXJ2aWNlLXByb2plY3QtcmVhbG0iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiIzMTAzOWEyOC1hZmY5LTRmZmMtOTBlYy0yMzZkMWE5NTcyOTkiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiJ0ZXN0IHVzZXIiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0dXNlciIsImdpdmVuX25hbWUiOiJ0ZXN0IiwiZmFtaWx5X25hbWUiOiJ1c2VyIiwiZW1haWwiOiJ0ZXN0dXNlckBnbWFpbC5jb20ifQ.YIzc-z1ojQp6ohZfE1KD8O8Z_CQfLTtK7C9tQA8XUxQQ56RZOOuO_6X2k_yTLCis7a9ecTV7bpza9_Nm3M2dPy9h1MMV6d__kWG_kCXmEPbfCl0O2XDWnw0RTqyAGm4ZvupMgAGZCA6wmr7yqDQMadgMkRLD7P25ops6du48OeTnY6aMest0xhZnjCwWqmKRtrUAlrJ2jo-eQ8ujxq8UWOA8EOpELLZZllV9h6JKEXF5Rv6G8LtBJR4MPYEPoVqSI37AyFomLJeWsDqFE6BFHmdOteivTx0j8dLveaXR58rMdh0JC5TGf3aq57EiLsX-nkniiKGcs3DkrkMeUkMxNA
Почему не проходит аутентификация в контекст. В туториале который я смотрел , она проходила автоматически
Ответы (1 шт):
Все дело было в неправильной версии зависимостей. Выглядеть должно так
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-jose</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-resource-server</artifactId>
</dependency>