Quantcast
Channel: Active questions tagged header - Stack Overflow
Viewing all articles
Browse latest Browse all 649

How to add a request interceptor to a feign client?

$
0
0

I want every time when I make a request through feign client, to set a specific header with my authenticated user.

This is my filter from which I get the authentication and set it to the spring security context:

@EnableEurekaClient@SpringBootApplication@EnableFeignClientspublic class PerformanceApplication {    @Bean    public Filter requestDetailsFilter() {        return new RequestDetailsFilter();    }    public static void main(String[] args) {        SpringApplication.run(PerformanceApplication.class, args);    }    private class RequestDetailsFilter implements Filter {        @Override        public void init(FilterConfig filterConfig) throws ServletException {        }        @Override        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {            String userName = ((HttpServletRequest)servletRequest).getHeader("Z-User-Details");            String pass = ((HttpServletRequest)servletRequest).getHeader("X-User-Details");            if (pass != null)                pass = decrypt(pass);            SecurityContext secure = new SecurityContextImpl();            org.springframework.security.core.Authentication token = new UsernamePasswordAuthenticationToken(userName, pass);            secure. setAuthentication(token);            SecurityContextHolder.setContext(secure);            filterChain.doFilter(servletRequest, servletResponse);        }        @Override        public void destroy() {        }    }    private String decrypt(String str) {        try {            Cipher dcipher = new NullCipher();            // Decode base64 to get bytes            byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);            // Decrypt            byte[] utf8 = dcipher.doFinal(dec);            // Decode using utf-8            return new String(utf8, "UTF8");        } catch (javax.crypto.BadPaddingException e) {        } catch (IllegalBlockSizeException e) {        } catch (UnsupportedEncodingException e) {        } catch (java.io.IOException e) {        }        return null;    }}

This is my feign client:

@FeignClient("holiday-client")public interface EmailClient {    @RequestMapping(value = "/api/email/send", method = RequestMethod.POST)    void sendEmail(@RequestBody Email email);}

And here I have a request interceptor:

@Componentpublic class FeignRequestInterceptor implements RequestInterceptor {    private String headerValue;    public FeignRequestInterceptor() {    }    public FeignRequestInterceptor(String username, String password) {        this(username, password, ISO_8859_1);    }    public FeignRequestInterceptor(String username, String password, Charset charset) {        checkNotNull(username, "username");        checkNotNull(password, "password");        this.headerValue = "Basic "+ base64encode((username +":"+ password).getBytes(charset));    }    private static String base64encode(byte[] bytes) {        BASE64Encoder encoder = new BASE64Encoder();        return encoder.encode(bytes);    }    @Override    public void apply(RequestTemplate requestTemplate) {        requestTemplate.header("Authorization", headerValue);    }}

I don't know how to configure this interceptor to my client and how to set the header with the username and password. How can I accomplish that ?


Viewing all articles
Browse latest Browse all 649

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>