Я пытаюсь создать проект микросервисов в Spring Boot. Зависимости: < /p>
Spring Boot Cloud Gateway < /li>
Eureka Discovery Server < /li>
Балансировщик загрузки пружинной загрузки (в шейке API) < /li>
< /ol>
Я получаю ather-service-service-service-service-service, используемый @one @on iscycravice-eiscover. Они видны на веб -графическом интерфейсе. Я добавил аутентификацию JWT в Auth-Service, но не использовал фильтр, поскольку она используется в шлюзе API. < /P>
SecurityConfig для Auth-service:
@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:
@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());
}
}
< /code>
When I directly access AUTH-SERVICE's login endpoint (which has @RequestMapping("/auth") и @postmapping ("/login") ), используя почтальон, я получаю токен и объект пользователя. Но нажимать на конечную точку через API-Gateway I Get: < /p>
403 Запрещено-Доступ отказан < /p>
< /blockquote>
Конфигурации маршрутизации для API-gateway: < /p>
@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>
application.yaml file of API-GATEWAY:
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/**
Подробнее здесь: https://stackoverflow.com/questions/797 ... t-requests