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 mais j'ai vu que lorsque je implémente le L'objet LOGINDETAILS est comme ci-dessous < / p> dans la situation ci-dessus Comment utiliser la sécurité du ressort. Ici, l'utilisateur doit donner toutes les informations pour le valider. P> p> userDétailsService CODE>, puis appelle une procédure pour authentifier L'utilisateur. p>
userdetailsservice code> comme ci-dessous p>
4 Réponses :
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. P>
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
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. P>
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. P>
Vous pouvez accéder à Remarque: il s'agit d'une méthode statique, ce qui signifie que cela ne va pas être amical à un test unitaire. p>
Vous pouvez également baisser la mise sous-jacente au J'espère que cela aide. P> actuelRequestattributes () code>, qui renvoie un objet
requestAttributes code> objet. Vous pouvez interroger l'objet RequestTtributes pour obtenir l'attribut souhaité de la portée souhaitée. P>
servletrequestattributes code> si vous souhaitez avoir accès au sous-jacent
httpservletQuest code> p>
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é.
Ce n'est pas la responciibilité de userDétailsService code>
pour valider authentification code>
jeton. C'est ce que authentificationProvider Code>
fait.
Alors, laissez votre implémentation que d'intercepter des paramètres supplémentaires à partir d'une formulaire de connexion, vous devez implémenter et pour faire la mise en œuvre de validation votre propre que vous avez juste besoin de transmettre vos implémentations à espère que cela aide! p> ps
Envisager une injection de constructeur sur l'injection de champ! Il est plus testable et indique le contrat de la classe mieux. Voir cette discussion . P> p> userDétailsService
La seule responsabilité de charger toutes les données de l'utilisateur à partir de la base de données par Login code>: < / p>
AuthentificationDétailSource code>
. C'est peut-être une bonne idée d'étendre WebAuthenticationDétails code>
, mais vous pouvez avoir un objet renvoyé par authentificationDétailSource code>
. p> authentificationProvider Code>
en mettant en œuvre l'interface elle-même ou en étendant
ou daoauthentinicationProvider code>
: p> authentificationManager
> et
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 de code dédié pour réussir le message localisé au client. .
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.
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: 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> 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 ----}