2017-08-23 1 views
1

J'ai beaucoup de services et je veux centraliser mon authentification avec un service d'authentification. Maintenant, je suis un noobie à Spring Boot et je n'ai aucune idée de comment je rends cela possible. Je viens d'implémenter la sécurité normale de Spring et cela fonctionne parfaitement et je ne trouve que quelques tutoriels sur jdbcAuthentication, inMemoryAuthentication, etc. mais pas une authentification où le service d'authentification envoie une requête à un autre service. Quelqu'un at-il une idée à ce sujet?Spring Boot Authorization Server envoyer la demande au service externe pour obtenir les détails de l'utilisateur

Ma sécurité basée sur des jetons ->JWT

Je pense que je dois manipuler le AuthenticationManagerBuilder parce qu'il décide si un nom d'utilisateur est valide ou non.

protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
} 

et je fais ma demande avec Feindre - peut-être au mauvais endroit pour ce code

@Override 
public Authentication attemptAuthentication(HttpServletRequest req, HttpServletResponse res) throws AuthenticationException, IOException, ServletException { 
    AccountCredentials credentials = new ObjectMapper() 
      .readValue(req.getInputStream(), AccountCredentials.class); 

    UserRequest userRequest = Feign.builder() 
      .decoder(new GsonDecoder()) 
      .target(UserRequest.class,"http://localhost:7998/api/user-service/user/" + credentials.getUsername()); 

    return getAuthenticationManager().authenticate(new UsernamePasswordAuthenticationToken(credentials.getUsername(),credentials.getPassword(),emptyList())); 
} 
+0

L'idée derrière JWT est qu'ils » re stateless et autonome. – chrylis

+0

Oui, mais pour obtenir un jeton, vous devez vérifier le nom d'utilisateur et mot de passe. Et ces données n'appartiennent pas à mon service d'authentification. Il devrait toujours demander mon service utilisateur. Après cela, il retourne le jeton – DrMed

Répondre

1

Vous pouvez configurer la façon suivante:

@Override 
public void init(AuthenticationManagerBuilder auth) throws Exception 
{ 
    auth.userDetailsService(getUserDetailsService()); 
} 

@Bean 
UserDetailsService getUserDetailsService() { 
    return username -> 
    { 
    JSONObject user = callUserService(username); //Here you send the UserRequest 
    if(user.has("email")) { 
     return new User(
     user.getString("email"), 
     user.getString("password"), 
     true, true, true, true, 
     Collections.emptyList()); 
    } else { 
      throw new BadCredentialsException("BadCredentialsException"); 
     } 
    }; 
} 
+0

Est-il possible d'obtenir le type de données de la requête? Parce qu'il va envoyer via le corps de la demande et j'ai besoin de ma demande d'API le nom d'utilisateur du corps. Peut-être en tant que paramètre? PS: Cela fonctionne avec votre approche juste j'ai besoin de la demande. – DrMed

+0

Je pense que vous devez fournir un exemple de ce dont vous avez besoin. Aussi, si cette réponse fonctionne pour vous, veuillez la marquer comme correcte. – alayor

+0

Je ne sais pas comment mais le nom d'utilisateur a déjà reçu le nom d'utilisateur du corps de la requête: D Pouvez-vous me l'expliquer? retour nom d'utilisateur -> { – DrMed