programing

Spring Boot에서 현재 로그인한 사용자를 확인하는 방법

iphone6s 2023. 3. 8. 20:50
반응형

Spring Boot에서 현재 로그인한 사용자를 확인하는 방법

이 Spring Boot 어플리케이션에는 로그인한 사용자의 데이터를 반환하는 웹 서비스가 있습니다.

@RequestMapping("/resource")
public Map<String, Object> home() {
    Map<String, Object> model = new HashMap<String, Object>();
    model.put("id", UUID.randomUUID().toString());
    model.put("content", "Hello World");
    return model;
}

메서드의 반환값은 현재 로그인한 사용자에 따라 달라집니다.

어떤 사용자가 이 방법으로 로그인하고 있는지 어떻게 알 수 있습니까?

요청에 따라:

Spring Security를 내부적으로 사용하는 Spring Boot에서는 Security Context Holder 클래스를 제공합니다.이 클래스를 사용하면 다음 방법으로 현재 인증된 사용자를 검색할 수 있습니다.

Authentication auth = SecurityContextHolder.getContext().getAuthentication();

인증 인스턴스는 다음 방식을 제공합니다.

  • 로그인한 사용자의 사용자 이름을 가져옵니다.getPrincipal()
  • 인증된 사용자의 암호를 가져옵니다.getCredentials()
  • 인증된 사용자에게 할당된 역할을 가져옵니다.getAuthorities()
  • 인증된 사용자에 대한 자세한 내용은 다음과 같습니다.getDetails()

Spring Security 3.2 이후 현재 로그인 사용자(실장:UserDetails) 컨트롤러 메서드 내에 파라미터를 추가함으로써 다음 절차를 수행합니다.

import org.springframework.security.web.bind.annotation.AuthenticationPrincipal;

@RequestMapping("/resource")
public Map<String, Object> home(@AuthenticationPrincipal User user) {
   ..
}

교체하다User당신의 클래스 이름과 함께.UserDetails인터페이스입니다.

편집:

Spring Security 4.0 주석이 다른 패키지로 이동되었기 때문에:

import org.springframework.security.core.annotation.AuthenticationPrincipal;

부록:

이것은, 에서라도 동작합니다.WebFlux사후 대응적인 환경과SecurityContextHolder.getContext().getAuthentication()이는 요청 모델당 스레드에서 스레드당 여러 요청으로 패러다임이 바뀌기 때문에 작동하지 않습니다.

Http ServletRequest를 사용하여 사용자 원칙을 얻을 수도 있습니다.

Http ServletRequest 요청을 사용하여

String user=request.getUserPrincipal().getName();

한 가지 방법은 다음과 같습니다.java.security.Principal다음과 같이 파라미터로 지정합니다.

@RequestMapping("/resource")
public Map<String, Object> home(Principal principal) {
    Map<String, Object> model = new HashMap<String, Object>();
    model.put("id", UUID.randomUUID().toString());
    model.put("content", "Hello " + principal.getName());
    return model;
}

버전 5.2 이후로는 Current Security Context 주석을 사용할 수 있습니다.

@GetMapping("/hello")
public String hello(@CurrentSecurityContext(expression="authentication?.name")
                    String username) {
    return "Hello, " + username + "!";
}

스프링 부트 v2.1.9에서이름을 얻으려고 할 경우 해제,email,given_name자세한 내용은 에서 확인할 수 있습니다.Pricipal.

참고: 구글에서 스프링 보안을 사용하고 있습니다.oauth2.

Map<String , Object> userDetails = ((DefaultOidcUser)SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getAttributes();
        System.out.println(userDetails.get("name"));
        System.out.println(userDetails.get("email"));
        System.out.println(userDetails.get("given_name"));

최근 Keyclock 인증 서버를 사용하여 현재 로그인한 사용자 데이터에 액세스할 수 있습니다.

String userID;

KeycloakPrincipal kcPrincipal = getPrincipal();
KeycloakSecurityContext ksContext = kcPrincipal.getKeycloakSecurityContext();
IDToken idToken = ksContext.getToken();
userID = idToken.getName();

OAuth와 함께 스프링 부츠 2.0을 사용하고 있어서 이렇게 하고 있습니다.

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
Object pricipal = auth.getPrincipal();
String user="";
if (pricipal instanceof DefaultOidcUser) {
       user = ((DefaultOidcUser) pricipal).getName();
}

스프링 보안 기능을 사용하지 않고 현재 로그인한 사용자 이름을 찾을 수 있습니다.jdk 1.8만 있으면 됩니다.

다음을 수행합니다.

@RequestMapping("/login")
@Override
public ModelAndView AuthChecker(@RequestParam("email") String email, @RequestParam("password") String password, Customers cust) {

     ModelAndView mv = new ModelAndView("index");
     if((repo.findByEmail(email)!=null) && (repo.findByPassword(password)!=null)) {
        
         
      List<Customers> l=  repo.findAll();
      
      cust = (Customers) l.stream() 
      .filter(x -> email.equals(x.getEmail()))        
      .findAny()                                      
      .orElse(null); 
    
        mv.addObject("user",cust.getName());
         mv.setViewName("DashBoardRedirect");
    
         return mv;

이름을 성공적으로 가져오면 모든 jsp/thymeleaf 보기에서 동일한 이름을 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/31159075/how-to-find-out-the-currently-logged-in-user-in-spring-boot

반응형