Agregue UserDetailsService personalizado a la aplicación Spring Security OAuth2

¿Cómo agrego el personalizadoUserDetailsService abajo paraesta muestra de Spring OAuth2?

El valor por defectouser con defectopassword se define en elapplication.properties archivo de laauthserver aplicación

Sin embargo, me gustaría agregar la siguiente costumbreUserDetailsService aeldemo paquete de laauthserver aplicación con fines de prueba:

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

Como puedes ver, estoUserDetailsService no esautowired todavía, y utiliza contraseñas inseguras a propósito porque solo está diseñado para fines de prueba.

¿Qué cambios específicos deben hacerse enla aplicación de muestra GitHub para que un usuario pueda iniciar sesión comousername=Samwise conpassword=TheShireo comousername=Frodo conpassword=MyRing? ¿Es necesario hacer cambios enAuthserverApplication.java o en otro lado?

SUGERENCIAS

losGuía del desarrollador de Spring OAuth2 dice que use unGlobalAuthenticationManagerConfigurer configurar unUserDetailsService globalmente Sin embargo, buscar esos nombres en Google produce resultados menos que útiles.

Además, una aplicación diferente que usa seguridad de resorte interna EN LUGAR DE OAuth usa la siguiente sintaxis para conectar elUserDetailsService, pero no estoy seguro de cómo ajustar su sintaxis al OP actual:

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

Traté de usar@Autowire dentro deOAuth2AuthorizationConfig para conectarUsers alAuthorizationServerEndpointsConfigurer como sigue:

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

Pero los registros de Spring Boot indican que el usuarioSamwise no se encontró, lo que significa que elUserDetailsService no se conectó con éxito. Aquí está el extracto relevante de los registros de Spring Boot:

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

¿Qué más puedo probar?

Respuestas a la pregunta(2)

Su respuesta a la pregunta