3

Wie füge ich den benutzerdefinierten UserDetailsService unten zu this Spring OAuth2 sample hinzu?Hinzufügen von benutzerdefiniertem UserDetailsService zu Spring Security OAuth2 App

Der Standard user mit Standard password in der application.properties Datei des authserver App definiert.

Allerdings würde Ich mag die folgende benutzerdefinierte UserDetailsService zu the demo package of the authserver app zu Testzwecken hinzuzufügen:

package demo; 

import java.util.List; 
import org.springframework.security.core.GrantedAuthority; 
import org.springframework.security.core.authority.AuthorityUtils; 
import org.springframework.security.core.userdetails.UserDetails; 
import org.springframework.security.core.userdetails.UsernameNotFoundException; 
import org.springframework.security.provisioning.UserDetailsManager; 
import org.springframework.stereotype.Service; 

@Service 
class Users implements UserDetailsManager { 

    @Override 
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
     String password; 
     List<GrantedAuthority> auth = AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_USER"); 
     if (username.equals("Samwise")) { 
      auth = AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_HOBBIT"); 
      password = "TheShire"; 
     } 
     else if (username.equals("Frodo")){ 
      auth = AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_HOBBIT"); 
      password = "MyRing"; 
     } 
     else{throw new UsernameNotFoundException("Username was not found. ");} 
     return new org.springframework.security.core.userdetails.User(username, password, auth); 
    } 

    @Override 
    public void createUser(UserDetails user) {// TODO Auto-generated method stub 
    } 

    @Override 
    public void updateUser(UserDetails user) {// TODO Auto-generated method stub 
    } 

    @Override 
    public void deleteUser(String username) {// TODO Auto-generated method stub 
    } 

    @Override 
    public void changePassword(String oldPassword, String newPassword) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public boolean userExists(String username) { 
     // TODO Auto-generated method stub 
     return false; 
    } 
} 

Wie Sie sehen können, diese UserDetailsService nicht autowired noch ist, und es verwendet absichtlich unsichere Passwörter, weil es nur zu Testzwecken konzipiert.

Welche konkreten Änderungen müssen the GitHub sample app gemacht werden, so dass ein Benutzer als username=Samwise mit password=TheShire anmelden kann, oder als username=Frodo mit password=MyRing? Müssen Änderungen an AuthserverApplication.java oder anderswo vorgenommen werden?


VORSCHLÄGE:


Die Spring OAuth2 Developer Guide sagt ein GlobalAuthenticationManagerConfigurer zu verwenden, um eine UserDetailsService global zu konfigurieren. Das Googlen dieser Namen führt jedoch zu weniger als nützlichen Ergebnissen.

Auch eine andere Anwendung, die Sicherheit interne Feder verwendet STATT OAuth verwendet die folgende Syntax, um die UserDetailsService zu anschließen, aber ich bin nicht sicher, wie die Syntax der aktuellen OP anzupassen:

@Order(Ordered.HIGHEST_PRECEDENCE) 
@Configuration 
protected static class AuthenticationSecurity extends GlobalAuthenticationConfigurerAdapter { 

    @Autowired 
    private Users users; 

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

I versuchte @Autowire innerhalb des OAuth2AuthorizationConfig mit Users zum AuthorizationServerEndpointsConfigurer zu verbinden, wie folgt:

@Autowired//THIS IS A TEST 
private Users users;//THIS IS A TEST 

@Override 
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
    endpoints.authenticationManager(authenticationManager) 
     .accessTokenConverter(jwtAccessTokenConverter()) 
     .userDetailsService(users)//DetailsService)//THIS LINE IS A TEST 
     ; 
} 

aber die Feder Boot-Protokolle anzeigen, dass der Benutzer Samwise wa s nicht gefunden, was bedeutet, dass UserDetailsService nicht erfolgreich angeschlossen wurde. Hier ist der relevante Auszug aus dem Frühjahr Boot-Protokolle:

2016-04-20 15:34:39.998 DEBUG 5535 --- [nio-9999-exec-9] o.s.s.a.dao.DaoAuthenticationProvider : 
     User 'Samwise' not found 
2016-04-20 15:34:39.998 DEBUG 5535 --- [nio-9999-exec-9] 
     w.a.UsernamePasswordAuthenticationFilter : 
     Authentication request failed: 
     org.springframework.security.authentication.BadCredentialsException: 
     Bad credentials 

Was kann ich noch versuchen?

Antwort

2

Ich stieß auf ein ähnliches Problem bei der Entwicklung meines OAuth-Servers mit Spring Security. Meine Situation war etwas anders, da ich eine UserDetailsService hinzufügen wollte, um die Aktualisierungstokens zu authentifizieren, aber ich denke, dass meine Lösung Ihnen auch helfen wird.

Wie Sie, versuchte ich zuerst die UserDetailsService mit der AuthorizationServerEndpointsConfigurer, aber dies funktioniert nicht. Ich bin mir nicht sicher, ob das ein Bug oder Design ist, aber die UserDetailsService muss in der AuthenticationManager gesetzt werden, damit die verschiedenen oauth2 Klassen es finden.Dieser arbeitete für mich:

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    Users userDetailsService; 

    @Autowired 
    public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception { 
    auth.userDetailsService(userDetailsService); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
    http.authorizeRequests() 
    // other stuff to configure your security 
    } 

} 

Ich denke, wenn man die folgende ab Zeile 73 geändert wird, kann es für Sie arbeiten:

@Override 
protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
    auth.parentAuthenticationManager(authenticationManager) 
     .userDetailsService(userDetailsService); 
} 

würden Sie natürlich auch @Autowired Users userDetailsService; irgendwo in WebSecurityConfigurerAdapter

hinzufügen müssen

Andere Dinge wollte ich erwähnen:

  1. Diese Version spezifisch sein können, ich m on spring-security-oauth2 2.0.12
  2. Ich kann keine Quellen dafür nennen, warum das so ist, ich bin mir nicht einmal sicher, ob meine Lösung eine echte Lösung oder ein Hack ist.
  3. Die in der Anleitung erwähnte GlobalAuthenticationManagerConfigurer ist mit ziemlicher Sicherheit ein Tippfehler, ich kann diese Zeichenfolge nirgendwo im Quellcode für irgendetwas im Frühling finden.
Verwandte Themen