티스토리 뷰
반응형
Spring Security를 사용하면 강력한 로그인 기능을 사용할 수 있는데
간혹 내부 관련 각 사이트들끼리 자동 로그인을 시킬때가 있다.
이때 보통 A사이트에 로그인한 id 값, 쿠키, 세션 정보등을 가지고
B사이트에 넘겨주어 계정 정보를 조회하여 별도의 로그인 없이 처리해주는 기능을 만들 수 있다.
간단하게 A 사이트에서 로그인 한 뒤 id값을 전달하여
B사이트에서 id 체크 후 로그인 처리를 바로 해버리는 컨트롤러를 하나 작성하면 된다.
@GetMapping("/loginWithoutForm/{id}")
public String loginWithoutform(@PathVariable(value="id") String id) {
UserDetails user = loginService.loadUserByUsername(id);
Authentication auth = new UsernamePasswordAuthenticationToken(user, "", user.getAuthorities());
SecurityContext context = SecurityContextHolder.createEmptyContext();
context.setAuthentication(auth);
SecurityContextHolder.setContext(context);
return "redirect:/home";
}
나는 기존에 구현해놓은 UserDetailService 의 loadUserByUsername() 메소드로 정보를 체크한 뒤
해당 계정 정보로 인증 객체를 생성하고
SecurityContext 에 인증객체를 담아 SecurityContextHolder 에 context를 설정해주면 인증이 security 인증이 완료된다.
SecurityContextHolder.getContext().setAuthentication(auth);
SecurityContextHolder 를 위와 같이 처리해도 되지만 멀티스레드일때 문제를 야기할 수 있으므로 지양하고
빈 SecurityContext 를 생성하여 사용하는 것이 안전하다.
참고블로그
반응형
'Java > SpringBoot&Spring' 카테고리의 다른 글
댓글