Spring Cloud Gateway не в состоянии перенаправлять запросыJAVA

Программисты JAVA общаются здесь
Anonymous
Spring Cloud Gateway не в состоянии перенаправлять запросы

Сообщение Anonymous »

Я пытаюсь создать проект микросервисов в Spring Boot. Это следующие зависимости, которые я использовал до сих пор: < /p>

Spring Boot Cloud Gateway < /li>
Eureka Discovery Server < /li>
Balancer Spring Boot Load (используется внутри API Gateway) < /li>
< /ol>
i is obst of a. а именно: Auth-Service и Shut-сервис. Они также видны и в веб-графическом интерфейсе. Это мой SecurityConfig для Auth-Service: < /p>

Код: Выделить всё

@Configuration
@EnableWebSecurity
public class SecurityConfig {

@Autowired
private UserService userService;

@Bean
PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}

@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(
requests -> requests
.requestMatchers("/auth/**", "/login", "/register")
.permitAll()
.anyRequest()
.authenticated())
.sessionManagement(manager -> manager.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authenticationProvider(getAuthenticationProvider());

return http.build();
}

@Bean
WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.allowedHeaders("*");
}
};
}

@Bean
AuthenticationProvider getAuthenticationProvider() {
DaoAuthenticationProvider provider = new DaoAuthenticationProvider(userService);
provider.setPasswordEncoder(passwordEncoder());
return provider;
}

@Bean
AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception {
return config.getAuthenticationManager();
}
}
< /code>
Теперь это jwtauthfilter, который я использую внутри моего API-Gateway < /p>
@Component
public class JwtAuthFilter implements GatewayFilter {

@Value("${jwt.secret.key}")
private String secretKey;

private Claims extractClaims(String token) {
return Jwts.parser()
.verifyWith((SecretKey) getSignInKey())
.build()
.parseSignedClaims(token)
.getPayload();
}

private boolean isTokenValid(String token) {
try {
Claims claims = extractClaims(token);
return claims.getExpiration().after(new Date());
} catch (Exception e) {
System.out.println("Invalid JWT token: " + e.getMessage());
}
return false;
}

private Key getSignInKey() {
final byte[] secretKey = Decoders.BASE64.decode(this.secretKey);
return Keys.hmacShaKeyFor(secretKey);
}

@Override
public Mono  filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("JWT Auth Filter is called");
ServerHttpRequest request = exchange.getRequest();

// Check if the incoming request has an auth header
if (!request.getHeaders().containsKey("Authorization")) {
System.out.println("No Authorization header found in the request");
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}

// Extract the JWT Token from the auth header
System.out.println("Extracting JWT Token from Authorization header");
String token = request.getHeaders().getFirst("Authorization").substring(7);

if (isTokenValid(token)) {
System.out.println("JWT Token is valid");
Claims claims = extractClaims(token);
String id = claims.get("id", String.class);
request = exchange.getRequest().mutate()
.header("X-User-Token", token)
.header("X-User-Id", id)
.build();
} else {
System.out.println("JWT Token is invalid or expired");
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
System.out.println("JWT Token is valid, proceeding with the request");
return chain.filter(exchange.mutate().request(request).build());
}

}
Когда я пытаюсь напрямую получить доступ к конечной точке входа в систему Auth-Service, которая имеет @requestmapping ("/auth") и @postmapping ("/login") , используя Postman, я получаю токен и объект пользователя как ожидается. Но когда я пытаюсь нанести удар по конечной точке через API-Gateway, я получаю 403 запрещен-доступ к доступу .@Configuration
public class ApiGatewayConfig {

@Autowired
private JwtAuthFilter jwtFilter;

@Bean
RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("auth-service", r -> r.path("/auth/**")
.uri("lb://AUTH-SERVICE"))
.route("chat-service-api", r -> r.path("/api/chats/**")
.filters(f -> f.stripPrefix(1).filter(jwtFilter))
.uri("lb://CHAT-SERVICE"))
.route("chat-service-ws", r -> r.path("/chat/ws/**")
.filters(f -> f.stripPrefix(1).filter(jwtFilter))
.uri("lb://CHAT-SERVICE"))

.build();
}

}

< /code>
и то же самое в моем приложении.spring:
application:
name : API-GATEWAY

cloud:
gateway:
default-filters:
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
server:
webmvc:
routes:
- id: auth-service
uri: lb://AUTH-SERVICE
predicates:
- Path=/auth/**
- id: chat-service
uri: lb://CHAT-SERVICE
predicates:
- Path=/api/chats/**
- Path=/chat/ws/**
< /code>
Я извиняюсь, если вопрос слишком длинный. Но я действительно не могу найти для этого. Очень хотела бы некоторую помощь здесь.

Подробнее здесь: https://stackoverflow.com/questions/797 ... t-requests

Вернуться в «JAVA»