java - requestmapping - Obtiene el objeto UserDetails del contexto de seguridad en el controlador Spring MVC
spring jsp (5)
Deje que la inyección de Spring 3 se encargue 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();
}
Estoy usando Spring Security 3 y Spring MVC 3.05.
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;
}
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;
}
Si solo desea imprimir el nombre de usuario en las páginas, tal vez le guste esta solución. Está libre de objetos fundidos 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;
}
Tenga en cuenta el parámetro " solicitud HttpServletRequest " agregado.
Funciona bien porque Spring inyecta sus propios objetos (wrappers) para HttpServletRequest, Principal etc., por lo que puede usar métodos java estándar para recuperar información del usuario.
Si ya está seguro de que el usuario ha iniciado sesión (en su ejemplo, si /index.html
está protegido):
UserDetails userDetails =
(UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
Para verificar primero si el usuario está conectado, verifique que la Authentication
actual no sea un AnonymousAuthenticationToken
Authentication
AnonymousAuthenticationToken
.
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (!(auth instanceof AnonymousAuthenticationToken)) {
// userDetails = auth.getPrincipal()
}
si está utilizando seguridad de primavera, puede obtener el usuario conectado actualmente
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String name = auth.getName(); //get logged in username