8
votes

Comment implémenter la sécurité du ressort lorsque la page de connexion a plus de champ à part du nom d'utilisateur et du mot de passe?

J'ai une page de connexion où l'utilisateur doit mettre les informations ci-dessous Numéro de VIN, e-mail, code postal et code d'accès qu'ils obtiendront à partir de différentes applications.

Pour valider un utilisateur, j'ai besoin de toutes les informations de My userDétailsService , puis appelle une procédure pour authentifier L'utilisateur.

mais j'ai vu que lorsque je implémente le userdetailsservice comme ci-dessous xxx

L'objet LOGINDETAILS est comme ci-dessous < / p> xxx

dans la situation ci-dessus Comment utiliser la sécurité du ressort. Ici, l'utilisateur doit donner toutes les informations pour le valider.


0 commentaires

4 Réponses :


2
votes

ici est votre Réponse, vous devez implémenter votre propre filtre et remplacer la valeur par défaut afin d'ajouter des paramètres au formulaire de connexion.


1 commentaires

Selon la réponse, j'ajouterai un filtre et stockera des données supplémentaires en session, mais comment obtenir l'objet de la session ou l'objet de demande dans la classe userDétailsService, cela n'est pas mentionné dans les réponses, aidez-moi s'il vous plaît



8
votes

Tout d'abord, je résoudrais votre problème différemment. Je ferais une authentification multi-étapes. Le premier serait un identifiant de nom d'utilisateur / mot de passe traditionnel, à l'aide du modèle par défaut de Spring Security. La deuxième étape consisterait à montrer une autre forme qui devrait être remplie par l'utilisateur pour fournir des détails supplémentaires pour l'authentification, que votre demande souhaite appliquer.

Quoi qu'il en soit, si vous souhaitez continuer à personnaliser le modèle de sécurité de printemps pour demander plus de détails sur la connexion en une seule étape. Suivez la référence des étapes dans la réponse précédente de @Petr. Et ensuite pour accéder à des attributs de session dans votre classe userDétailsService, utilisez le http://static.springsource.org/spring/docs/2.0.8/ap/org/springframework/web/context/request/requestcontextholder.html classe fournie par printemps.

Vous pouvez accéder à actuelRequestattributes () , qui renvoie un objet requestAttributes objet. Vous pouvez interroger l'objet RequestTtributes pour obtenir l'attribut souhaité de la portée souhaitée.

Remarque: il s'agit d'une méthode statique, ce qui signifie que cela ne va pas être amical à un test unitaire.

Vous pouvez également baisser la mise sous-jacente au servletrequestattributes si vous souhaitez avoir accès au sous-jacent httpservletQuest

J'espère que cela aide.


2 commentaires

Pouvons-nous remplacer la connexion nom d'utilisateur / mot de passe traditionnel avec la vérification OTP. Je veux dire sans utiliser l'utilisation du nom d'utilisateur et du mot de passe de la table utilisateur. Au lieu de cela, nom d'utilisateur et otpcode à partir de la table OTP.


@Amitsinghkaira Je vous recommanderais de publier cela comme sa propre question, avec un exemple de code / tout POP, vous avez peut-être déjà essayé.



9
votes

4 commentaires

Cela semble être exactement ce dont j'avais besoin. Test ... Entre-temps, à la méthode d'authentification sur l'utilisateurDétailsAuthenticationProviderImpl puis-je lancer une authentification personnaliséeException? Comment puis-je i18n?


Oui, vous pouvez lancer n'importe quelle sous-classe d'authentificationException. Exceptions I18N est un sujet génial et séparé. J'irais avoir une classe de base / interface de base d'exception commune qui porte une clé de message et des paramètres fournis au point de lancer l'exception et que résolu dans un @ExceptionHandler


Avec un peu de travail, cela a fonctionné pour moi. De plus, le problème I18N que j'ai faite en définissant de nouvelles configurations, mais c'est un autre fil. Je voudrais te remercier.


Pourriez-vous ajouter comment faire la configuration Java au lieu de XML pour cela? Merci.



0
votes

merci. J'ai créé une classe de filtres personnalisée pour authentifier l'utilisateur en fonction de trois paramètres - Nom d'utilisateur, mot de passe et identifiant de compte. Je l'ai modifié comme un haricot dans la classe SecurityConfig: xxx pré>

Ainsi, au lieu de simplement les champs de nom d'utilisateur traditionnels et de mot de passe, j'ai pu effectuer une authentification à l'aide de trois champs (nom d'utilisateur, mot de passe et compte de compte. ) En appelant les méthodes de service appropriées requises pour l'authentification et la définition des autorités de l'utilisateur connecté: p> xxx pré>

i devorçage à la suite de méthodes de nom d'utilisateurApasswordAuthenticationfilter Classe pour une redirection appropriée après l'authentification et l'autorisation: p>

 @RequestMapping(value = { "/login" }, method = RequestMethod.POST)

   public String loginPage(@Valid @ModelAttribute("user") User user, BindingResult result, ModelMap model, HttpServletRequest request){---- call ervice methods here ----}


0 commentaires