0

J'ai implémenté un UserDetailsService personnalisé qui recherche un utilisateur et lui permet d'obtenir un jeton oauth 2 en utilisant l'accord de mot de passe. Le service indique d'utiliser un userRepository JPA pour rechercher l'utilisateur.userRepository non sécurisé car userDetailsService doit rechercher l'utilisateur

Tout cela fonctionne, sauf que maintenant j'ai un/endpoint d'utilisateurs publiquement disponible tirant dans tous les utilisateurs et mots de passe à tout utilisateur authentifié. Idéalement, je ne souhaite pas que ce point de terminaison soit disponible, mais si je mets une fonction preAuthorize avec le rôle admin, tous les utilisateurs sont refusés en essayant d'obtenir un jeton de connexion, donc cela ne fonctionne pas non plus. Comment les gens contournent-ils ce problème? Je peux ajouter un matcher au serveur de ressources pour autoriser uniquement les utilisateurs admin, cela semble fonctionner, mais je ne veux pas que le point de terminaison soit disponible, il est assez effrayant de l'avoir juste là pour que UserDetailsService puisse l'utiliser pour obtenir des jetons d'accès.

Toute contribution sur ce que vous faites serait grandement appréciée.

//Example code: 
// Bad public facing endpoint returning all users and passwords 

public interface UserRepository extends JpaRepository<User, Long> { 
    User findOneByUsername(String username); 
} 

// Custom user details service used by oauth 2 to get access tokens 
// uses userRepo above 
@Service("userDetailsService") 
public class UserService implements UserDetailsService { 

    @Autowired 
    private UserRepository userRepository; 

    @Override 
    public UserDetails loadUserByUsername(String username) throws  UsernameNotFoundException { 
     return userRepository.findOneByUsername(username); 
    } 
} 

// class using user details service 
@Configuration 
@EnableAuthorizationServer 
public class OAuth2Config extends AuthorizationServerConfigurerAdapter { 

    @Qualifier("userDetailsService") 
    private UserDetailsService userDetailsService; 

    @Override 
    public void configure(AuthorizationServerEndpointsConfigurer configurer) throws Exception { 
     configurer.userDetailsService(userDetailsService); 
    } 


} 

Répondre

0

Je présume que vous utilisez Spring Data?

Dans ce cas, vous devez dire Spring ne pas exporter le point final:

@RepositoryRestResource(exported = false) 

https://docs.spring.io/spring-data/rest/docs/current/api/org/springframework/data/rest/core/annotation/RepositoryRestResource.html

+0

Merci ce que je cherchais. Comment l'exposer juste pour que l'utilisateur authentifié puisse avoir accès à ses propres informations d'utilisateur, comme l'email, les informations de profil, le nom d'utilisateur etc.?/user/authenticateUser mais pas d'autres points de terminaison comme/GET/users etc car c'est effrayant d'avoir ouvert? Serait-il préférable de créer un nouveau contrôleur dire/user-info/qui ne tire que dans leurs informations? Merci – Richard

+0

Je voudrais créer un point de terminaison séparé et quitter le point de terminaison Userdetails pour un usage interne. Dans ce nouveau point de terminaison, vous devez identifier l'utilisateur et obtenir ses informations. – JohanB