source

Spring MVC 컨트롤러의 Security Context에서 UserDetails 개체 가져오기

manycodes 2023. 7. 25. 21:09
반응형

Spring MVC 컨트롤러의 Security Context에서 UserDetails 개체 가져오기

Spring Security 3과 Spring MVC 3.05를 사용하고 있습니다.

현재 로그인한 사용자의 사용자 이름을 인쇄하고 싶은데 컨트롤러에서 사용자 세부 정보를 가져오려면 어떻게 해야 합니까?

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

사용자가 로그인했는지 이미 알고 있는 경우(예:/index.html보호됨):

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

사용자가 로그인했는지 먼저 확인하려면 현재 상태를 확인합니다.Authentication가 아닙니다.AnonymousAuthenticationToken.

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

스프링 3 주사로 이 일을 처리할 수 있습니다.

tunade21 덕분에 가장 쉬운 방법은 다음과 같습니다.

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

 }

페이지에 사용자 이름을 인쇄하려면 이 솔루션이 좋습니다.Spring Security를 사용하지 않아도 객체 캐스팅 및 작업이 무료입니다.

@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;
}

"HttpServletRequest" 매개 변수가 추가되었습니다.

Spring은 HttpServletRequest, Principal 등을 위해 자체 객체(래퍼)를 주입하므로 표준 Java 메서드를 사용하여 사용자 정보를 검색할 수 있으므로 잘 작동합니다.

또 다른 솔루션(Spring Security 3):

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

만약 당신이 스프링 보안을 사용하고 있다면 당신은 현재 로그인된 사용자를 얻을 수 있습니다.

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

아래 코드를 사용하여 본인(로그인한 사용자 이메일)을 확인할 수 있습니다.

  org.opensaml.saml2.core.impl.NameIDImpl principal =  
  (NameIDImpl) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

  String email = principal.getValue();

이 코드는 SAML 위에 작성되어 있습니다.

언급URL : https://stackoverflow.com/questions/6161985/get-userdetails-object-from-security-context-in-spring-mvc-controller

반응형