68b6ad337dfeacf8dd3cab53721a90f45184558d
[institute/sw-backend.git] /
1 package com.supwisdom.institute.backend.admin.bff.gateway.filter.factory;
2
3 import java.net.URLDecoder;
4
5 import lombok.Getter;
6 import lombok.Setter;
7 import lombok.extern.slf4j.Slf4j;
8
9 import org.springframework.cloud.gateway.filter.GatewayFilter;
10 import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
11 import org.springframework.http.server.reactive.ServerHttpRequest;
12 import org.springframework.security.core.Authentication;
13 import org.springframework.security.core.context.ReactiveSecurityContextHolder;
14 import org.springframework.security.core.context.SecurityContext;
15
16 import com.alibaba.fastjson.JSONObject;
17 import com.supwisdom.institute.backend.admin.bff.security.core.userdetails.MyUser;
18 import com.supwisdom.institute.backend.common.core.transmit.user.User;
19 import com.supwisdom.institute.backend.common.core.transmit.user.UserContext;
20
21 @Deprecated
22 @Slf4j
23 public class SimpleUserTransmitGatewayFilterFactory extends AbstractGatewayFilterFactory<SimpleUserTransmitGatewayFilterFactory.Config> {
24   
25   public SimpleUserTransmitGatewayFilterFactory() {
26     super(Config.class);
27   }
28
29   @Override
30   public GatewayFilter apply(Config config) {
31     return (exchange, chain) -> {
32       
33       
34 //      Mono<ServerWebExchange> m = Mono.fromCallable(() ->{
35 //        MyUser myUser = ReactiveSecurityContextHolder.getContext()
36 //            .filter(c -> c.getAuthentication() != null)
37 //            .map(SecurityContext::getAuthentication)
38 //            .map(Authentication::getPrincipal)
39 //            .cast(MyUser.class)
40 //            .block()
41 //          ;
42 //          try {
43 //            String jsonUser = JSONObject.toJSONString(myUser);
44 //            log.info(jsonUser);
45 //            String headerValue = new String(URLDecoder.decode(jsonUser,"UTF-8"));
46 //            ServerHttpRequest request = exchange.getRequest().mutate()
47 //                .header(UserContext.KEY_USER_IN_HTTP_HEADER, headerValue)
48 //                .build();
49 //            log.debug("User set ok");
50 //            return exchange.mutate().request(request).build();
51 //          } catch (Exception e) {
52 //            log.warn("User set error", e);
53 //          }
54 //          return exchange;
55 //      })
56 //      .publishOn(Schedulers.elastic())
57 //      ;
58 //      return m.flatMap(ex -> chain.filter(ex));
59
60       
61       return ReactiveSecurityContextHolder.getContext()
62           .filter(c -> c.getAuthentication() != null && c.getAuthentication().isAuthenticated() && c.getAuthentication().getPrincipal() instanceof MyUser)
63           .map(SecurityContext::getAuthentication)
64           .map(Authentication::getPrincipal)
65           .cast(MyUser.class)
66           .map(myUser -> {
67             try {
68               User user = new User(myUser.getUsername(), myUser.getRoles(), myUser.getAttributes());
69               
70               String jsonUser = JSONObject.toJSONString(user);
71               log.info(jsonUser);
72               String headerValue = new String(URLDecoder.decode(jsonUser,"UTF-8"));
73               ServerHttpRequest request = exchange.getRequest().mutate()
74                   .header(UserContext.KEY_USER_IN_HTTP_HEADER, headerValue)
75                   .build();
76               log.debug("User set ok");
77               return exchange.mutate().request(request).build();
78             } catch (Exception e) {
79               log.warn("User set error", e);
80             }
81             return exchange;
82           })
83           .flatMap(ex -> chain.filter(ex))
84         ;
85     };
86   }
87
88   public static class Config {
89     @Getter
90     @Setter
91     private String a;
92   }
93
94 }