2013-07-18 22 views
6

ho Spring MVC REST canale:Come ottenere il nome utente/Principal registrato nel canale Spring MVC REST?

@Controller 
@RequestMapping("/rest") 
public class REST { 

e ho il mio metodo:.

@RequestMapping(value = "/doSomething") 
public @ResponseBody DoSomethingResultDTO doSomething(
    @RequestBody DoSomethingRequestDTO) 

Ora ho bisogno il nome dell'utente che ha effettuato l'accesso Normalmente avrei potuto farlo con il metodo

HttpServletRequest.getUserPrincipal() 

ma come ottenerlo qui? Ho annotazioni per intestazioni (@RequestHeader) o anche cookie (@CookieValue). Ma come posso ottenere il Principal nel mio metodo?

risposta

19

È possibile iniettare oggetto principale al metodo del gestore di controllo

@RequestMapping(value = "/doSomething") 
public @ResponseBody DoSomethingResultDTO doSomething(
    @RequestBody DoSomethingRequestDTO, Principal principal) 

Vedi the spring reference manual for more info

+0

OK, il mio errore è stato, ho provato solo con le annotazioni. –

9

SecurityContextHolder + Authentication.getName()

import org.springframework.security.core.Authentication; 
import org.springframework.security.core.context.SecurityContextHolder; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.ModelMap; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

@Controller 
public class LoginController { 

    @RequestMapping(value="/login", method = RequestMethod.GET) 
    public String printUser(ModelMap model) { 

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

     model.addAttribute("username", name); 
     return "hello"; 

    } 

Here is reference

+0

Rispetto all'iniezione di Principal nel metodo controller, questo funzionerà anche in altri metodi di gestione che non possono essere iniettati dall'oggetto Principal. –

2

È inoltre possibile ottenere attraverso le annotazioni assumendo CustomUser implementa UserDetails

@RequestMapping(value = { "/home" }, method = RequestMethod.GET) 
public String home(@AuthenticationPrincipal CustomUser customUser, Model model, HttpServletRequest request, 
     HttpServletResponse response, Locale locale) throws Exception { 

    System.out.println("Entering Home Controller @AuthenticationPrincipal: " + customUser); 
} 

public class CustomUser implements UserDetails { // code omitted }