1 package com.supwisdom.institute.backend.gateway.filter;
3 import java.net.URLDecoder;
5 import lombok.extern.slf4j.Slf4j;
7 import org.springframework.cloud.gateway.filter.GatewayFilterChain;
8 import org.springframework.cloud.gateway.filter.GlobalFilter;
9 import org.springframework.core.Ordered;
10 import org.springframework.http.server.reactive.ServerHttpRequest;
11 import org.springframework.security.core.Authentication;
12 import org.springframework.security.core.context.ReactiveSecurityContextHolder;
13 import org.springframework.security.core.context.SecurityContext;
14 import org.springframework.web.server.ServerWebExchange;
16 import com.alibaba.fastjson.JSONObject;
17 import com.supwisdom.infras.security.core.userdetails.InfrasUser;
18 import com.supwisdom.institute.backend.common.core.transmit.user.User;
19 import com.supwisdom.institute.backend.common.core.transmit.user.UserContext;
21 import reactor.core.publisher.Mono;
24 public class SimpleUserTransmitGlobalFilter implements GlobalFilter, Ordered {
27 public int getOrder() {
32 public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
34 return ReactiveSecurityContextHolder.getContext()
36 return c.getAuthentication() != null && c.getAuthentication().isAuthenticated() && c.getAuthentication().getPrincipal() instanceof InfrasUser;
38 .map(SecurityContext::getAuthentication)
39 .map(Authentication::getPrincipal)
40 .cast(InfrasUser.class)
43 User user = new User(myUser.getUsername(), myUser.getRoles(), myUser.getAttributes());
45 String jsonUser = JSONObject.toJSONString(user);
47 String headerValue = new String(URLDecoder.decode(jsonUser,"UTF-8"));
48 ServerHttpRequest request = exchange.getRequest().mutate()
49 .header(UserContext.KEY_USER_IN_HTTP_HEADER, headerValue)
51 log.debug("User set ok");
52 return exchange.mutate().request(request).build();
53 } catch (Exception e) {
54 log.warn("User set error", e);
58 .flatMap(ex -> chain.filter(ex))