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