7c3af6fabdf7bec3629c50c7240bea48a8cd5eb7
[institute/sw-backend.git] /
1 package com.supwisdom.institute.backend.gateway.filter;
2
3 import lombok.extern.slf4j.Slf4j;
4
5 import org.apache.commons.codec.binary.Base64;
6 import org.springframework.cloud.gateway.filter.GatewayFilterChain;
7 import org.springframework.cloud.gateway.filter.GlobalFilter;
8 import org.springframework.core.Ordered;
9 import org.springframework.http.server.reactive.ServerHttpRequest;
10 import org.springframework.security.core.Authentication;
11 import org.springframework.security.core.context.ReactiveSecurityContextHolder;
12 import org.springframework.security.core.context.SecurityContext;
13 import org.springframework.web.server.ServerWebExchange;
14
15 import com.alibaba.fastjson.JSONObject;
16 import com.supwisdom.infras.security.core.userdetails.InfrasUser;
17 import com.supwisdom.institute.backend.common.core.transmit.user.User;
18 import com.supwisdom.institute.backend.common.core.transmit.user.UserContext;
19
20 import reactor.core.publisher.Mono;
21
22 @Slf4j
23 public class SimpleUserTransmitGlobalFilter implements GlobalFilter, Ordered {
24
25   @Override
26   public int getOrder() {
27     return 0;
28   }
29
30   @Override
31   public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
32     
33     return ReactiveSecurityContextHolder.getContext()
34       .filter(c -> {
35         return c.getAuthentication() != null && c.getAuthentication().isAuthenticated() && c.getAuthentication().getPrincipal() instanceof InfrasUser;
36       })
37       .map(SecurityContext::getAuthentication)
38       .map(Authentication::getPrincipal)
39       .cast(InfrasUser.class)
40       .map(infrasUser -> {
41         try {
42           User user = new User(infrasUser.getUsername(), infrasUser.getRoles(), infrasUser.getAttributes());
43           
44           String jsonUser = JSONObject.toJSONString(user);
45           log.debug(jsonUser);
46           
47           //String headerValue = new String(URLDecoder.decode(jsonUser,"UTF-8"));
48           String headerValue = Base64.encodeBase64URLSafeString(jsonUser.getBytes("UTF-8"));
49           log.debug(headerValue);
50           
51           ServerHttpRequest request = exchange.getRequest().mutate()
52               .header(UserContext.KEY_USER_IN_HTTP_HEADER, headerValue)
53               .build();
54           log.debug("User set to gateway header: ok");
55           return exchange.mutate().request(request).build();
56         } catch (Exception e) {
57           log.warn("User set to gateway header: error", e);
58         }
59         return exchange;
60       })
61       .flatMap(ex -> chain.filter(ex))
62     ;
63   }
64
65 }