복붙노트

[SPRING] Spring MVC 컨트롤러의 보안 컨텍스트에서 UserDetails 객체 가져 오기

SPRING

Spring MVC 컨트롤러의 보안 컨텍스트에서 UserDetails 객체 가져 오기

스프링 보안 3과 스프링 MVC 3.05를 사용하고 있습니다.

현재 로그인 한 사용자의 사용자 이름을 인쇄하고 싶습니다. 어떻게 내 컨트롤러에서 UserDetails를 가져올 수 있습니까?

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

해결법

  1. ==============================

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

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

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

    먼저 사용자가 로그인했는지 확인하려면 현재 인증이 AnonymousAuthenticationToken이 아닌지 확인하십시오.

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

    2.스프링 3 분사가 이것을 처리하도록하십시오.

    스프링 3 분사가 이것을 처리하도록하십시오.

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

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

    3.페이지에 사용자 이름 만 인쇄하려는 경우이 솔루션이 마음에들 것입니다. 객체 주조물이 없으며 Spring Security가 없어도 작동합니다.

    페이지에 사용자 이름 만 인쇄하려는 경우이 솔루션이 마음에들 것입니다. 객체 주조물이 없으며 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 메소드를 사용하여 사용자 정보를 검색 할 수 있습니다.

  4. ==============================

    4.이것이 또 다른 해결책입니다 (Spring Security 3).

    이것이 또 다른 해결책입니다 (Spring Security 3).

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

    5.당신이 봄 보안을 사용한다면 당신은 현재 로그인 한 사용자를

    당신이 봄 보안을 사용한다면 당신은 현재 로그인 한 사용자를

    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
         String name = auth.getName(); //get logged in username
    
  6. from https://stackoverflow.com/questions/6161985/get-userdetails-object-from-security-context-in-spring-mvc-controller by cc-by-sa and MIT license