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
'programing' 카테고리의 다른 글
| 스프링 데이터, 중첩된 객체의 속성으로 찾기 (0) | 2023.03.08 |
|---|---|
| Django에서 Javascript DOM으로 객체 전달 (0) | 2023.03.08 |
| HttpClient용 공급자 없음 (0) | 2023.03.08 |
| MongoCredential 인증 예외 및 분류되지 않은 Mongo DB 예외 (0) | 2023.03.08 |
| 로드 밸런서에 클라이언트에 사용 가능한 서버가 없습니다. (0) | 2023.03.08 |