Connexion spéciale avec Spring Security

La société dans laquelle je travaille actuellement dispose d’un type particulier de processus d’authentification.

En effet, plusieurs utilisateurs peuvent avoir le même login et mot de passe. Donc, pour les identifier, l’utilisateur doit donner son email dans un deuxième temps. Mais encore une fois, dans quelques cas, plusieurs utilisateurs peuvent être concernés, puis l’utilisateur doit donner à son identifiant d’entreprise le statut d’authentification complet.

Le problème est que, dans certains cas, le processus d’authentification ne peut pas être effectué en une seule étape , ce qui correspond au comportement par défaut de la plupart des applications gérées par Spring Security.

Ma question est donc la suivante: quel est le moyen le plus simple de mettre en œuvre avec Spring Security ce processus de connexion spécial ?

Merci d’avance.

J’ai dû faire un processus d’authentification en deux étapes similaire. Cela semble simple, mais il n’a pas été facile de trouver le bon endroit pour injecter et les bonnes méthodes pour passer outre. L’idée de base est de fournir un autre rôle pour l’authentification intermédiaire (la vérification de l’email), puis d’accorder un access complet après confirmation de l’email.

Espérons que le code ci-dessous fournit de bonnes indications sur la façon dont il pourrait être résolu pour votre scénario.

Créez un UserDetailsChecker personnalisé pour gérer les contrôles post-authentification. C’est là que le rôle de l’utilisateur est déterminé.

public class CustomPostAuthenticationChecks implements UserDetailsChecker { public void check(UserDetails userDetails) { CustomUser customUser = (CustomUser) userDetails; if (customUser.needsEmailAuthentication()) { // Get rid of any authorities the user currently has userDetails.getAuthorities().clear(); // Set the new authority, only allowing access to the // email authentication page. userDetails.getAuthorities().add(new GrantedAuthorityImpl("ROLE_NEEDS_EMAIL_AUTH")); } else { userDetails.getAuthorities().add(new GrantedAuthorityImpl("ROLE_AUTHORIZED_USER")); } } 

Créez un AuthenticationSuccessHandler personnalisé. Cette classe envoie l’utilisateur à l’URL correcte en fonction de son rôle.

 public class CustomAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { @Override protected Ssortingng determineTargetUrl(HttpServletRequest request, HttpServletResponse response) { Ssortingng targetUrl = null; SecurityContext securityContext = SecurityContextHolder.getContext(); Collection authorities = securityContext.getAuthentication().getAuthorities(); if (authorities.contains(new GrantedAuthorityImpl("ROLE_NEEDS_EMAIL_AUTH"))) { targetUrl = "/authenticate"; } else if (authorities.contains(new GrantedAuthorityImpl("ROLE_AUTHORIZED_USER"))) { targetUrl = "/authorized_user_url"; } else { targetUrl = super.determineTargetUrl(request, response); } return targetUrl; } 

Une fois l’adresse électronique de l’utilisateur authentifiée, vous devez lui octroyer un access complet à l’application:

 public void grantUserAccess(User user) { SecurityContext securityContext = SecurityContextHolder.getContext(); Authentication auth = securityContext.getAuthentication(); user.getAuthorities().clear(); user.getAuthorities().add(new GrantedAuthorityImpl("ROLE_AUTHORIZED_USER")); Authentication newAuth = new UsernamePasswordAuthenticationToken(user, auth.getCredentials(), user.getAuthorities()); securityContext.setAuthentication(newAuth); } 

Définissez un fournisseur d’authentification personnalisé pour enregistrer vos contrôles CustomPostAuthenticationChecks:

         

Si vous utilisez la balise form-login standard, vous pouvez facilement définir votre AuthenticationSuccessHandler personnalisé:

  ...  

Ajoutez une nouvelle règle d’interception de rôle pour l’URL / authenticate afin que seuls les utilisateurs nécessitant davantage d’authentification puissent accéder à cette page.