2011-05-28 8 views
57

Estoy usando Spring Security 3 y Spring MVC 3.05.Obtiene el objeto UserDetails del contexto de seguridad en el controlador Spring MVC

Me gustaría imprimir el nombre de usuario de usuario actualmente conectado, ¿cómo puedo obtener UserDetails en mi controlador?

@RequestMapping(value="/index.html", method=RequestMethod.GET) 
    public ModelAndView indexView(){ 
     UserDetails user = ? 
       mv.addObject("username", user.getUsername()); 
     ModelAndView mv = new ModelAndView("index"); 
     return mv; 
    } 

Respuesta

101

Si ya sabe con seguridad que el usuario está conectado (en el ejemplo, si /index.html está protegido):

UserDetails userDetails = 
(UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 

comprobar primero si el usuario está conectado, controlar que la corriente Authentication no es un AnonymousAuthenticationToken.

Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
if (!(auth instanceof AnonymousAuthenticationToken)) { 
     // userDetails = auth.getPrincipal() 
} 
+7

esto me da una excepción: 'java.lang.ClassCastException: java.lang .String no se puede convertir en org.springframework.security.core.userdetails.UserDetails' –

+1

da el molde de clase – cherit

+0

¡Gracias, amigo! ¡Muy apreciado! – Lawrence

3

Si solo desea imprimir el nombre de usuario en las páginas, tal vez le guste esta solución. Es libre de piezas de fundición de objetos y funciona sin Spring Security también:

@RequestMapping(value = "/index.html", method = RequestMethod.GET) 
public ModelAndView indexView(HttpServletRequest request) { 

    ModelAndView mv = new ModelAndView("index"); 

    String userName = "not logged in"; // Any default user name 
    Principal principal = request.getUserPrincipal(); 
    if (principal != null) { 
     userName = principal.getName(); 
    } 

    mv.addObject("username", userName); 

    // By adding a little code (same way) you can check if user has any 
    // roles you need, for example: 

    boolean fAdmin = request.isUserInRole("ROLE_ADMIN"); 
    mv.addObject("isAdmin", fAdmin); 

    return mv; 
} 

Nota parámetro "HttpServletRequest solicitud" añadió.

Funciona bien porque Spring inyecta sus propios objetos (envoltorios) para HttpServletRequest, Principal etc., por lo que puede utilizar métodos Java estándar para recuperar información del usuario.

1

si está utilizando la seguridad de primavera, entonces puede obtener la corriente usuario conectado por

Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
    String name = auth.getName(); //get logged in username 
23

Let Spring 3 de inyección de hacerse cargo de esto.

Gracias a tsunade21 la forma más fácil es:

@RequestMapping(method = RequestMethod.GET) 
public ModelAndView anyMethodNameGoesHere(Principal principal) { 
     final String loggedInUserName = principal.getName(); 

} 
+0

Increíble. Hace las pruebas mucho más fáciles que cuando se usan métodos estáticos en SecurityContextHolder. – Planky

1

Esa es otra solución (Spring Security 3):

public String getLoggedUser() throws Exception { 
    String name = SecurityContextHolder.getContext().getAuthentication().getName(); 
    return (!name.equals("anonymousUser")) ? name : null; 
} 
Cuestiones relacionadas