Untitled

 avatar
unknown
plain_text
13 days ago
1.8 kB
5
Indexable
public class ReactiveUserContextFilter implements WebFilter {

	/*
	 * In some the UserContext should always we created, i.e. we do not use the
	 * UserContext from request header, we create the UserContext from the access token
	 */
	@Value("${mvr.external-service:false}")
	private boolean externalService;
	
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
    	log.info("reuseUserContext => " +externalService);

    	var response = exchange.getResponse();
    	response.beforeCommit(() -> {
    		List<String> userContextJson = response.getHeaders()
		            .getOrDefault(UserContext.USER_CONTEXT_KEY, Collections.emptyList());
    		
		    if (!userContextJson.isEmpty()) {
		    	response.getHeaders().remove(UserContext.USER_CONTEXT_KEY);
		    	
		    	if(!externalService) {
		    		response.getHeaders().add(UserContext.USER_CONTEXT_KEY, Base64.getEncoder().encodeToString(userContextJson.get(0).getBytes()));
		    	}
		    } 
    		
    		return Mono.empty();
    	});
    	
    	
        Mono<UserContext> userContext;
        List<String> userContextJson = exchange
                .getRequest()
                .getHeaders()
                .getOrDefault(UserContext.USER_CONTEXT_KEY, Collections.emptyList());
        
        if (!userContextJson.isEmpty()) {
        	if(!externalService) {
        		userContext = Mono.just(UserContextHolder.fromJson(
        				new String(Base64.getDecoder().decode(userContextJson.get(0).getBytes())))
        				);
        	} else {
        		userContext = exchange.getPrincipal().map(UserContext::new);
        	}
        } else {
            userContext = exchange.getPrincipal().map(UserContext::new);
        }
        
        return UserContextHolder.setToReactiveContext(chain.filter(exchange), userContext);
    }
}
Leave a Comment