2011-03-24 8 views
7

Estoy intentando implementar lo siguiente, pero mi instancia de authenticationManager arroja la excepción a continuación y no está autoconectada. ¿Cómo obtengo una instancia de Spring de forma manual? No estoy usando un controlador de primavera, estoy usando un bean con ámbito de solicitud JSF. Obtengo la siguiente excepción en tiempo de ejecución cuando el contenedor intenta autoaumentar el authenticationManager. El requestCache viene bien. No entiendo por qué tengo dos casos ...Obtener instancia de AuthenticationManager manualmente

config:

<authentication-manager> 
     <authentication-provider user-service-ref="userManager"> 
       <password-encoder ref="passwordEncoder" /> 
     </authentication-provider> 
    </authentication-manager> 

La inyección de dependencias autowired fallado; la excepción anidada es org.springframework.beans.factory.BeanCreationException: no se pudo autocausar el campo: protected org.springframework.security.authentication.AuthenticationManager com.dc.web.actions.SignUpDetail.authenticationManager; la excepción anidada es org.springframework.beans.factory.NoSuchBeanDefinitionException: no se define ningún bean único de tipo [org.springframework.security.authentication.AuthenticationManager]: bean de coincidencia única esperada pero se encontró 2: [org.springframework.security.authentication.ProviderManager # 0, org.springframework.security.authenticationManager] javax.faces.webapp.FacesServlet.service (FacesServlet.java:325)

@Controller 
public class SignupController 
{ 

    @Autowired 
    RequestCache requestCache; 

    @Autowired 
    protected AuthenticationManager authenticationManager; 

    @RequestMapping(value = "/account/signup/", method = RequestMethod.POST) 
    public String createNewUser(@ModelAttribute("user") User user, BindingResult result, HttpServletRequest request, HttpServletResponse response) 
    { 
     //After successfully Creating user 
      authenticateUserAndSetSession(user, request); 

     return "redirect:/home/"; 
    } 

    private void authenticateUserAndSetSession(User user, 
     HttpServletRequest request) 
    { 
     UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
       user.getUsername(), user.getPassword()); 

     // generate session if one doesn't exist 
     request.getSession(); 

     token.setDetails(new WebAuthenticationDetails(request)); 
     Authentication authenticatedUser = authenticationManager.authenticate(token); 

     SecurityContextHolder.getContext().setAuthentication(authenticatedUser); 
    } 

} 
+0

¿Está diciendo que el campo 'authenticationManager' es nulo? ¿Está 'requestCache' conectado correctamente? – skaffman

+0

@skaffman gracias por la respuesta, actualicé un poco mis preguntas con más información. Lo que publiqué antes no era correcto, no es nulo. El contenedor dice que tengo dos instancias de authenticationManager pero no veo cómo. Pegué mi configuración también, alguna idea? Solo estoy tratando de hacer un inicio de sesión automático después de un registro exitoso. ¿Debo usar mi userManager para iniciar sesión automáticamente? userManager no tiene un método que tome un UsernamePasswordAuthenticationToken – c12

Respuesta

33

en primer lugar, proporcionar un nombre de frijol explícita para su AuthenticationManager

<authentication-manager alias="authenticationManager"> 
    ... 
</authentication-manager> 

En segundo lugar, use el calificador cuando se autoconecte:

@Autowired 
@Qualifier("authenticationManager") 
protected AuthenticationManager authenticationManager; 
+0

esto es raro ... ¿por qué no funciona sin alias? – Xorty

+0

@Xorty Sin alias, debe adivinar el nombre generado automáticamente para el bean de authentication manager (no estoy seguro de que tenga un nombre por defecto). En teoría, podría funcionar si utiliza el enlace por tipo y no por nombre, aunque esto rara vez es el caso en los sistemas del mundo real. –

+0

@BorisKirzner cómo puedo usar esto para autenticar mi objeto de usuario porque necesito recibir el usuario de un dispositivo móvil en httprequest y autenticarlo y enviar la identificación de la sesión como token –

Cuestiones relacionadas