Benutzerdefinierten UserDetailsService zur Spring Security OAuth2-App hinzufügen

Wie füge ich das benutzerdefinierte @ hinzUserDetailsService unten zudieses Frühjahrs-OAuth2-Beispiel?

Der Standarduser mit Standardpassword ist im @ definieapplication.properties Datei desauthserver app.

Ich möchte jedoch die folgenden benutzerdefinierten @ hinzufügUserDetailsService zudasdemo Paket desauthserver app zu Testzwecken:

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, diesesUserDetailsService ist nichtautowired noch nicht, und es verwendet absichtlich unsichere Passwörter, da es nur zu Testzwecken entwickelt wurde.

Welche spezifischen Änderungen müssen an @ vorgenommen werdedie GitHub Beispiel-App damit sich ein Benutzer als @ anmelden kausername=Samwise mitpassword=TheShire oder alsusername=Frodo mitpassword=MyRing? Müssen Änderungen an @ vorgenommen werdeAuthserverApplication.java oder woanders?

VORSCHLÄGE

DasSpring OAuth2 Developer Guide sagt ein @ zu verwendGlobalAuthenticationManagerConfigurer um ein @ zu konfigurierUserDetailsService global. Wenn Sie diese Namen googeln, erhalten Sie jedoch weniger als hilfreiche Ergebnisse.

Auch eine andere App, die die interne Federsicherheit verwendet. STATT OAuth verwendet die folgende Syntax, um das @ anzuschließeUserDetailsService, aber ich bin nicht sicher, wie ich die Syntax an das aktuelle OP anpassen soll:

@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);
    }
}

Ich habe versucht mit@Autowire innerhalb desOAuth2AuthorizationConfig verbindenUsers zumAuthorizationServerEndpointsConfigurer 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 Spring Boot-Protokolle zeigen an, dass der BenutzerSamwise wurde nicht gefunden, was bedeutet, dass dasUserDetailsService wurde nicht erfolgreich verbunden. Hier ist der relevante Auszug aus den Spring Boot-Protokollen:

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 sonst noch probieren?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage