6d0d981641f1bece4a52065da2d7441bcf0ec085
[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 @Slf4j
22 public class SimpleUserTransmitGatewayFilterFactory extends AbstractGatewayFilterFactory<SimpleUserTransmitGatewayFilterFactory.Config> {
23   
24   public SimpleUserTransmitGatewayFilterFactory() {
25     super(Config.class);
26   }
27
28   @Override
29   public GatewayFilter apply(Config config) {
30     return (exchange, chain) -> {
31       
32       
33 //      Mono<ServerWebExchange> m = Mono.fromCallable(() ->{
34 //        MyUser myUser = ReactiveSecurityContextHolder.getContext()
35 //            .filter(c -> c.getAuthentication() != null)
36 //            .map(SecurityContext::getAuthentication)
37 //            .map(Authentication::getPrincipal)
38 //            .cast(MyUser.class)
39 //            .block()
40 //          ;
41 //          try {
42 //            String jsonUser = JSONObject.toJSONString(myUser);
43 //            log.info(jsonUser);
44 //            String headerValue = new String(URLDecoder.decode(jsonUser,"UTF-8"));
45 //            ServerHttpRequest request = exchange.getRequest().mutate()
46 //                .header(UserContext.KEY_USER_IN_HTTP_HEADER, headerValue)
47 //                .build();
48 //            log.debug("User set ok");
49 //            return exchange.mutate().request(request).build();
50 //          } catch (Exception e) {
51 //            log.warn("User set error", e);
52 //          }
53 //          return exchange;
54 //      })
55 //      .publishOn(Schedulers.elastic())
56 //      ;
57 //      return m.flatMap(ex -> chain.filter(ex));
58
59       
60       return ReactiveSecurityContextHolder.getContext()
61           .filter(c -> c.getAuthentication() != null && c.getAuthentication().isAuthenticated() && c.getAuthentication().getPrincipal() instanceof MyUser)
62           .map(SecurityContext::getAuthentication)
63           .map(Authentication::getPrincipal)
64           .cast(MyUser.class)
65           .map(myUser -> {
66             try {
67               User user = new User(myUser.getUsername(), myUser.getRoles(), myUser.getAttributes());
68               
69               String jsonUser = JSONObject.toJSONString(user);
70               log.info(jsonUser);
71               String headerValue = new String(URLDecoder.decode(jsonUser,"UTF-8"));
72               ServerHttpRequest request = exchange.getRequest().mutate()
73                   .header(UserContext.KEY_USER_IN_HTTP_HEADER, headerValue)
74                   .build();
75               log.debug("User set ok");
76               return exchange.mutate().request(request).build();
77             } catch (Exception e) {
78               log.warn("User set error", e);
79             }
80             return exchange;
81           })
82           .flatMap(ex -> chain.filter(ex))
83         ;
84     };
85   }
86
87   public static class Config {
88     @Getter
89     @Setter
90     private String a;
91   }
92
93 }