7

J'ai configuré mes services micro en utilisant les services Spring boot zuul et eureka. Maintenant, je dois authentifier tous les itinéraires/appels d'API REST. Je veux dire, pour toutes les API, le client envoie un accessToken. Sur le service zuul, avant le routage vers le service particulier, je dois appeler un micro service (auth-service) avec accessToken et ce service d'authentification vérifiera que l'utilisateur existe ou non pour l'accessToken envoyé. Si accessToken est valide, seul le routage doit avoir lieu.Authentification pour accéder aux routes de service Spring Zuul

S'il vous plaît aidez-moi à mettre en œuvre cela en utilisant le service de démarrage de printemps.

Merci.

+0

est-ce pas votre accessToken un jeton signé, vous pouvez faire confiance? –

+0

printemps-sécurité est le moyen de le faire correctement. Vous ne devriez faire cela que si vous savez qu'il n'y a aucun moyen pour un appelant de contourner votre proxy et d'accéder directement au microservice. –

+0

@Andy Brown, pouvez-vous s'il vous plaît fournir en détail ou un lien pour vérifier? – Krish

Répondre

3

Vous devez écrire un filtre. Un zuul pré filtre est ce dont vous avez besoin. Vous pouvez accéder à votre serveur d'authentification dans le filtre et si le jeton n'est pas valide, vous n'appelez pas votre microservice et renvoyez une réponse immédiatement. Si c'est valide, vous laissez la demande descendre aux micro-services.

Une classe de filtre exemple:

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

Merci pour votre réponse. Je peux définir une réponse sous forme de chaîne. ctx.setResponseBody ("Accès invalide ...!"); Je dois définir le corps de la réponse comme un objet personnalisé comme ValidationResponse. ValidationResponse est mon objet de réponse unique pour tous les services. Quelque chose comme ci-dessous: validationResponse.setSuccess (false); validationResponse.setMessage ("Accès non valide ..."); Puis définissez cette validationResponse comme objet de réponse. Pouvez-vous s'il vous plaît aider avec ça ?? – Krish

+0

@Krishna, Pas de problème, il suffit de définir requestContext responseBody. J'ai mis à jour la réponse. (Je définis le type de contenu sur json Si vous utilisez xml, vous pouvez définir le type de contenu en conséquence) – barbakini

+0

Non, com.netflix.zuul.context.RequestContext.setResponseBody() ne supporte que le type de données String. – Krish