2016-10-26 4 views
2

Я хочу, чтобы каждый раз, когда я делал запрос через feign client, задавал конкретный заголовок с моим аутентифицированным пользователем.Как добавить запрос-перехватчик к фальшивому клиенту?

Это мой фильтр, от которого я получаю проверку подлинности и установить его в контекст пружинной безопасности:

@EnableEurekaClient 
@SpringBootApplication 
@EnableFeignClients 
public 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; 
    } 
} 

Это мой симулировать клиент:

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

А вот у меня есть запрос перехватчик :

@Component 
public 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); 
    } 
} 

Я не знаю, как настроить этот перехватчик на моего клиента и как его использовать t заголовок с именем пользователя и паролем. Как я могу это сделать?

ответ

3

Вам не нужна ваша собственная реализация FeignRequestInterceptor, так как в пакете feign.auth уже есть BasicAuthRequestInterceptor, который делает то же самое.

С учетом этого у вас в основном есть почти все настроенное уже. Осталось только определить bean-компоненты basicAuthRequestInterceptor с конкретным именем пользователя и паролем:

@Bean 
public RequestInterceptor basicAuthRequestInterceptor { 
    return new BasicAuthRequestInterceptor("username", "password"); 
} 
Смежные вопросы