package com.poscoict.onm.apigw.filter;
import com.poscoict.onm.apigw.model.dto.UserDto;
import io.micrometer.core.instrument.util.JsonUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.cloud.gateway.filter.factory.AbstractNameValueGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.ServerWebExchangeDecorator;
import org.springframework.web.server.WebSession;
import reactor.core.publisher.Mono;
import java.security.Principal;
@Component
public class MyAddRequestHeaderGatewayFilterFactory extends AbstractGatewayFilterFactory<MyAddRequestHeaderGatewayFilterFactory.Config> {
public MyAddRequestHeaderGatewayFilterFactory() {
super(MyAddRequestHeaderGatewayFilterFactory.Config.class);
}
@Override
public GatewayFilter apply(Config config) {
// 1. 헤더에 정보를 세팅하는 경우 case1
// return (exchange, chain) -> {
// ServerHttpRequest request =
// exchange.getRequest().mutate()
// .header("authuser", "사용자이름")
// .build();
// return chain.filter(exchange.mutate().request(request).build());
// };
// 2. 헤더에 사용자 정보만 넘기는 경우 case2
return (exchange, chain) -> exchange.getPrincipal()
.map(Principal::getName)
.defaultIfEmpty("unauthorized")
.map(userName -> {
//adds header to proxied request
exchange
.getRequest()
.mutate()
.header("authuser", userName)
.build();
return exchange;
})
.flatMap(chain::filter);
}
public static class Config {
//Put the configuration properties for your filter here
}
}
spring:
profiles: local
cloud:
gateway:
routes:
- id: dummy_a
uri: http://localhost:8881
predicates:
- Path=/a/**
filters:
- MyAddRequestHeader
- PreserveHostHeader
- SaveSession
- RewritePath=/a(?<segment>/?.*), /${segment}
- id: dummy_b
uri: http://localhost:8882
predicates:
- Path=/b/**
filters:
- MyAddRequestHeader
- PreserveHostHeader
- SaveSession
- RewritePath=/b(?<segment>/?.*), /${segment}