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)

Printemps de Sécurité est open source, vous avez à disposition du code source. Vous êtes probablement avoir des problèmes parce que DaoAuthenticationProvider est conçu pour être une source managed bean.

OriginalL'auteur rawkfist0215 | 2013-08-01