9b649700f826068a32b887b4e668ea11ce47e18f
[institute/sw-backend.git] /
1 package com.supwisdom.institute.backend.gateway.filter;
2
3 import java.net.URLDecoder;
4
5 import lombok.extern.slf4j.Slf4j;
6
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;
15
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;
20
21 import reactor.core.publisher.Mono;
22
23 @Slf4j
24 public class SimpleUserTransmitGlobalFilter implements GlobalFilter, Ordered {
25
26   @Override
27   public int getOrder() {
28     return 0;
29   }
30
31   @Override
32   public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
33     
34     return ReactiveSecurityContextHolder.getContext()
35       .filter(c -> {
36         return c.getAuthentication() != null && c.getAuthentication().isAuthenticated() && c.getAuthentication().getPrincipal() instanceof InfrasUser;
37       })
38       .map(SecurityContext::getAuthentication)
39       .map(Authentication::getPrincipal)
40       .cast(InfrasUser.class)
41       .map(myUser -> {
42         try {
43           User user = new User(myUser.getUsername(), myUser.getRoles(), myUser.getAttributes());
44           
45           String jsonUser = JSONObject.toJSONString(user);
46           log.info(jsonUser);
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)
50               .build();
51           log.debug("User set ok");
52           return exchange.mutate().request(request).build();
53         } catch (Exception e) {
54           log.warn("User set error", e);
55         }
56         return exchange;
57       })
58       .flatMap(ex -> chain.filter(ex))
59     ;
60   }
61
62 }