Spring Security - Utilisateur avec connexion automatique après l’enregistrement

Spring Security - Utilisateur avec connexion automatique après l'enregistrement

1. Vue d'ensemble

Dans ce rapide didacticiel, nous expliquerons comment authentifier automatiquement les utilisateurs immédiatement après le processus d'inscription - dans une implémentation Spring Security.

En termes simples, une fois que l'utilisateur a terminé son enregistrement, il est généralement redirigé vers la page de connexion et doit maintenant retaper son nom d'utilisateur et son mot de passe.

Voyons comment nous pouvons éviter cela en authentifiant automatiquement l'utilisateur.

Avant de commencer, notez que nous travaillons dans le cadre desregistration series ici sur le site.

2. Utilisation desHttpServletRequest

Un moyen très simple de forcer une authentification par programme consiste à utiliser la méthodeHttpServletRequest login():

public void authWithHttpServletRequest(HttpServletRequest request, String username, String password) {
    try {
        request.login(username, password);
    } catch (ServletException e) {
        LOGGER.error("Error while login ", e);
    }
}

Maintenant que, sous le capot, l'APIHttpServletRequest.login() utilise lesAuthenticationManager pour effectuer l'authentification.

Il est également important de comprendre et de gérer lesServletException qui peuvent survenir à ce niveau.

3. Utilisation desAuthenticationManager

Ensuite, nous pouvons également créer directement unUsernamePasswordAuthenticationToken - puis parcourir manuellement lesAuthenticationManager standard:

public void authWithAuthManager(HttpServletRequest request, String username, String password) {
    UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(username, password);
    authToken.setDetails(new WebAuthenticationDetails(request));

    Authentication authentication = authenticationManager.authenticate(authToken);

    SecurityContextHolder.getContext().setAuthentication(authentication);
}

Notez comment nous créons la demande de jeton, la transmettons via le flux d'authentification standard, puis définissons explicitement le résultat dans le contexte de sécurité actuel.

4. Inscription complexe

Dans certains scénarios plus complexes, le processus d'enregistrement comporte plusieurs étapes, telles que, par exemple, une étape de confirmation jusqu'à ce que l'utilisateur puisse se connecter au système.

Dans de tels cas, il est bien entendu important de comprendre exactement où nous pouvons authentifier automatiquement l'utilisateur. Nous ne pouvons pas le faire immédiatement après leur inscription car, à ce stade, le compte nouvellement créé est toujours désactivé.

En termes simples -we have to perform the automatic authentication after they confirm their account.

De plus, n'oubliez pas qu'à ce stade, nous n'avons plus accès à leurs informations d'identification brutes réelles. Nous n'avons accès qu'au mot de passe codé de l'utilisateur - et c'est ce que nous utiliserons ici:

public void authWithoutPassword(User user){
    List privileges = user.getRoles().stream()
      .map(role -> role.getPrivileges())
      .flatMap(list -> list.stream())
      .distinct().collect(Collectors.toList());
    List authorities = privileges.stream()
        .map(p -> new SimpleGrantedAuthority(p.getName()))
        .collect(Collectors.toList());

    Authentication authentication = new UsernamePasswordAuthenticationToken(user, null, authorities);
    SecurityContextHolder.getContext().setAuthentication(authentication);
}

Notez comment nous définissons correctement les autorités d'authentification ici, comme ce serait généralement le cas dans lesAuthenticationProvider.

5. Conclusion

Nous avons discuté de différentes manières d'auto-authentifier les utilisateurs après le processus d'inscription.

Comme toujours, le code source complet est disponibleover on GitHub.