7

Skonfigurowałem moje usługi mikro przy użyciu usług Spring boot zuul i eureka. Teraz potrzebuję uwierzytelnić wszystkie wywołania tras/wywołania REST API. Mam na myśli, że dla wszystkich klientów API wysyłać jeden accessToken. Na usłudze zuul, przed routowaniem do konkretnej usługi, muszę wywołać usługę mikro (auth-service) z accessToken i ta usługa uwierzytelniania sprawdzi, czy użytkownik istnieje, czy nie dla wysłanego tokena dostępu. Jeśli token access jest ważny, to powinno się odbywać tylko routing.Uwierzytelnianie w celu uzyskania dostępu do usług Spring boot Usługi Zuul

Pomóż mi zaimplementować to za pomocą usługi rozruchu sprężynowego.

Dzięki.

+0

nie jest twoim accessToken podpisany Reklamowe można zaufać? –

+0

wiosna-bezpieczeństwo to sposób, aby to zrobić właściwie. Powinieneś to zrobić w ogóle, jeśli wiesz, że nie ma mowy, aby dzwoniący mógł po prostu ominąć twój serwer proxy i bezpośrednio nacisnąć na mikroserwis. –

+0

@Andy Brown, czy możesz podać szczegóły lub link do sprawdzenia? – Krish

Odpowiedz

3

Musisz napisać filtr. Niezbędny jest filtr zuul pre. Możesz uzyskać dostęp do swojego serwera uwierzytelniania w filtrze i jeśli token jest nieważny, nie wywołujesz swojej mikroserwisu i natychmiast zwracasz odpowiedź. Jeśli jest ona ważna, pozwalasz, aby żądanie zostało przekazane do mikroprzedsiębiorstw.

Klasa przykład filtr:

public class AuthFilter extends ZuulFilter { 

    @Autowired 
    RestTemplate restTemplate; 

    @Override 
    public String filterType() { 
     return "pre"; 
    } 

    @Override 
    public int filterOrder() { 
     return 1; 
    } 

    @Override 
    public boolean shouldFilter() { 
     return true; 
    } 

    @Override 
    public Object run() { 
     RequestContext ctx = RequestContext.getCurrentContext(); 
     //get your token from request context and send it to auth service via rest template 
     boolean validToken = restTemplate.exchange(or getForObject or other methods of restTemplate which you find suitable for method and return type of your auth service controller method) 
     if(!validToken) { 
      ctx.setSendZuulResponse(false); //This makes request not forwarding to micro services 
      ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value()); 
      ValidationResponse validationResponse = new ValidationResponse(); 
      validationResponse.setSuccess(false); 
      validationResponse.setMessage("Invalid Access..."); 
      ObjectMapper mapper = new ObjectMapper(); 
      String responseBody = mapper.writeValueAsString(validationResponse); 
      ctx.setResponseBody(validationResponse); 
      ctx.getResponse().setContentType("application/json"); 
      //If you want to do any thing else like logging etc, you can do it. 
     } 
     return null; 
    } 

} 
+0

Dziękuję za odpowiedź. Potrafię ustawić odpowiedź jako ciąg. ctx.setResponseBody ("Nieprawidłowy dostęp ...!"); Potrzebuję ustawić ciało odpowiedzi jako obiekt niestandardowy, taki jak ValidationResponse. ValidationResponse to mój unikalny obiekt odpowiedzi dla wszystkich usług. Coś jak poniżej: validationResponse.setSuccess (false); validationResponse.setMessage ("Nieprawidłowy dostęp ..."); Następnie ustaw tę właściwość validationResponse jako obiekt odpowiedzi. Czy możesz w tym pomóc? – Krish

+0

@Krishna, Nie ma problemu, wystarczy ustawić requestContext responseBody. Zaktualizowałem odpowiedź (ustawiłem typ zawartości na json, jeśli używasz xml, możesz odpowiednio ustawić typ zawartości) – barbakini

+0

Nie, com.netflix.zuul.context.RequestContext.setResponseBody() obsługuje tylko typ danych String. – Krish