2017-08-23 1 views
1

Ich habe viele Dienste und möchte meine Authentifizierung mit einem Authentifizierungsdienst zentralisieren. Jetzt bin ich ein Neuling bei Spring Boot und ich habe keine Ahnung, wie ich das möglich mache.Spring Boot Authorization Server Anfrage an externen Dienst senden, um Benutzerdetails zu erhalten

Ich implementiere einfach die normale Sicherheit von Spring und es funktioniert perfekt und ich finde nur einige Tutorials über jdbcAuthentication, inMemoryAuthentication, etc, aber keine Authentifizierung, wo der Authentifizierungs-Service eine Anfrage an einen anderen Dienst senden. Hat jemand eine Ahnung davon?

Meine Sicherheit basierend auf Token ->JWT

Ich glaube, ich die AuthenticationManagerBuilder manipulieren müssen, weil es einen Benutzernamen gültig ist oder nicht entscheidet, ob.

protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
} 

und ich mache meine Anfrage mit Feign - vielleicht der falsche Ort für diesen 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

Die Idee hinter JWT ist, dass sie‘ re staatenlos und in sich geschlossen. – chrylis

+0

Ja, aber um ein Token zu erhalten, müssen Sie Benutzername und Passwort überprüfen. Und diese Daten gehören nicht zu meinem Auth-Service. Er sollte immer meinen User-Service fragen. Danach gibt er das Token zurück – DrMed

Antwort

1

Sie es auf diese Weise konfigurieren:

@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

Gibt es eine Möglichkeit, den Anfragedatentyp zu bekommen? Weil es via Anfragetext versendet wird und ich für meine API Anfrage den Body-Benutzernamen benötige. Vielleicht als Parameter? PS: Es funktioniert mit Ihrem Ansatz, nur ich brauche die Anfrage. – DrMed

+0

Ich denke, Sie müssen ein Beispiel dafür geben, was Sie brauchen. Wenn diese Antwort für Sie funktioniert, markieren Sie sie bitte als korrekt. – alayor

+0

Ich weiß nicht wie, aber der Benutzername hat schon den Benutzernamen aus dem Anfragetext: D Kannst du es mir erklären? return Benutzername -> { – DrMed

Verwandte Themen