1 package com.supwisdom.institute.backend.gateway.filter;
3 import lombok.extern.slf4j.Slf4j;
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;
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;
20 import reactor.core.publisher.Mono;
23 public class SimpleUserTransmitGlobalFilter implements GlobalFilter, Ordered {
26 public int getOrder() {
31 public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
33 return ReactiveSecurityContextHolder.getContext()
35 return c.getAuthentication() != null && c.getAuthentication().isAuthenticated() && c.getAuthentication().getPrincipal() instanceof InfrasUser;
37 .map(SecurityContext::getAuthentication)
38 .map(Authentication::getPrincipal)
39 .cast(InfrasUser.class)
42 User user = new User(infrasUser.getUsername(), infrasUser.getRoles(), infrasUser.getAttributes());
44 String jsonUser = JSONObject.toJSONString(user);
47 //String headerValue = new String(URLDecoder.decode(jsonUser,"UTF-8"));
48 String headerValue = Base64.encodeBase64String(jsonUser.getBytes("UTF-8"));
51 ServerHttpRequest request = exchange.getRequest().mutate()
52 .header(UserContext.KEY_USER_IN_HTTP_HEADER, headerValue)
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);
61 .flatMap(ex -> chain.filter(ex))