Comment puis-je par programme authentifier l'utilisateur avec Ressort de Sécurité à l'aide de DaoAuthenticationProvider
Je me demandais ce que je fais de mal ici pour authentifier un utilisateur. J'ai une application dans laquelle l'utilisateur passe par plusieurs étapes pour activer son compte, et donc, je tiens à contourner le formulaire de connexion et de les prendre directement à leur tableau de bord.
Voici ce que ma connexion automatique fonction ressemble:
protected void automatedLogin(String username, String password, HttpServletRequest request) {
try {
//Must be called from request filtered by Spring Security, otherwise SecurityContextHolder is not updated
CustomUserDetailsService udService = new CustomUserDetailsService(userDAO, request);
UserDetails uDetails = udService.loadUserByUsername(username);
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(uDetails, password);
token.setDetails(new WebAuthenticationDetails(request));
DaoAuthenticationProvider authenticator = new DaoAuthenticationProvider();
Authentication authentication = authenticator.authenticate(token);
SecurityContextHolder.getContext().setAuthentication(authentication);
} catch (Exception e) {
e.printStackTrace();
SecurityContextHolder.getContext().setAuthentication(null);
}
}
Je dois utiliser le DaoAuthenticationProvider classe que mon fournisseur d'authentification. J'ai vérifié que je suis un UserDetails modèle contenant les informations d'identification correctes, ID, l'autorité de rôles, etc.
Lors de l'appel à la méthode d'authentification que je tombe sur un Pointeur Null, quelque part le long du chemin dans la DaoAuthenticationProvider classe:
org.springframework.de sécurité.l'authentification.AuthenticationServiceException
au
org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:109)
au
org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationprovider.authenticate(AbstractUserDetailsAuthenticationprovider.java:132)
au
com.bosch.actions.BaseController.doAutoLogin(BaseController.java:659)
. . . Causés par: java.lang.NullPointerException à
org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:101)
Je ne suis vraiment pas sûr de ce qui est nul, que je n'ai pas le code source disponible.
Modifier
J'ai été en mesure de trouver le code source ici - https://github.com/SpringSource/spring-security/blob/master/core/src/main/java/org/springframework/security/authentication/dao/DaoAuthenticationProvider.java
J'ai été en mesure de se déplacer le Pointeur Null en définissant explicitement la UserDetailsService sur l'objet:
authenticator.setUserDetailsService(udService);
Mais maintenant je reçois des informations d'identification incorrectes exception quand je sais que le mot de passe est correct, parce que je l'ai vu dans le débogueur dans le UserDetails objet défini plus haut dans le code.
org.springframework.de sécurité.l'authentification.BadCredentialsException:
De mauvaises informations d'identification à
org.springframework.security.authentication.dao.DaoAuthenticationProvider.additionalAuthenticationChecks(DaoAuthenticationProvider.java:87)
au
org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationprovider.authenticate(AbstractUserDetailsAuthenticationprovider.java:149)
OriginalL'auteur rawkfist0215 | 2013-08-01
Vous devez vous connecter pour publier un commentaire.
J'ai été en mesure d'obtenir l'authentification de travail en assemblant toutes les propriétés définies dans le ressort de haricots définition, et par programme sur le DaoAuthenticationProvider objet. Regardant en arrière, il semble que il peut avoir été une question idiote, mais j'espère que cela aide quelqu'un!
Code Corrigé:
Ce n'est pas l'utilisation normale du Printemps de Sécurité dans l'application. C'est un exemple où j'ai besoin de déconnecter l'utilisateur sans leur fournir les informations d'identification dans un formulaire. À chaque fois qu'ils se connecteront via le formulaire, et le printemps de sécurité de haricots vont faire le travail. Après avoir expliqué que, si vous êtes celui qui downvoted la réponse, je l'espère, vous changez d'avis, parce que je pense qu'elle a injustement fait mal à ma réputation sur StackOverflow.
Rassurez-vous, mon ami, je n'ai pas voter vous. Je ne pense pas que la réponse est incorrecte, j'étais juste en suggérant Printemps de Sécurité n'était pas destiné à être utilisé de cette façon. Et P. S. vers le Bas à droit de vote vous permettrait de réduire ma réputation sur DONC trop... 🙂
En outre, l'authentification par programmation de cette façon serait également de l'utiliser à l'intérieur d'une fonctionnelle de la suite de test, qui est la raison pour laquelle je suis ici. Ne présumez pas de contexte.
OriginalL'auteur rawkfist0215