스프링 부트 시큐리티는 localhost:8080/logout이 자동 로그아웃 주소이다.
successHandler
시큐리티가 로그인에 성공했을 때 무조건 타게 하는 핸들러이다.
이전에는 defaultSuccessUrl("/")을 사용하여 메인 페이지로 가게 했는데
핸들러를 만들어 해당 유저의 블로그로 넘어가도록 해줄 것이다.
successHandler를 사용하려면 인수로 AuthenticationSuccessHandler( ) 타입을 넣어줘야 하는 강제성을 부여한다.
AuthenticationSuccessHandler가 인터페이스이기 때문에 바로 new 해줄 수 없다.
바로 익명 클래스를 넣어줘도 되긴 하는데 코드가 지저분해지기 때문에
AuthenticationSuccessHandler( ) 타입을 implements 받은 LoginSuccessHandler를 하나 만들어준 다음
successHandler에는 LoginSuccessHandler를 new 해준다.
이 AuthenticationSuccessHandler가 Authentication 객체를 준다.
우리는 원래 로그인에 성공하면 세션에 User 오브젝트를 넣어 관리했었다.
시큐리티를 사용하면 로그인했을 때 JSESSIONID로 구분된 세션 영역에
User 오브젝트를 바로 넣는 게 아니라 SecurityContextHolder 객체를 하나 만든다.
그 객체 안에 Authentication이라는 객체를 만들어서
이 객체 안에 Principal이라는 객체를 만든다.
이 Authentication이라는 객체는 Principal 뿐만 아니라 Credentials(비밀번호), Authorities(권한)도 들고 있다.
package site.metacoding.blogv3.handler;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import site.metacoding.blogv3.config.auth.LoginUser;
import site.metacoding.blogv3.domain.user.User;
public class LoginSuccessHandler implements AuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
LoginUser loginUser = (LoginUser) authentication.getPrincipal();
User principal = loginUser.getUser();
HttpSession session = request.getSession();
session.setAttribute("principal", principal);
response.sendRedirect("/user/" + principal.getId() + "/post");
}
}
ContextHolder.getContext.getAuthentication.getPrincipal( )하면 User 오브젝트가 나온다.
이 Principal에 들어가 있는 게 UserDetails이다.
우리가 LoginService에서 LoginUser 타입 리턴해줬잖아!
이 LoginUser가 UserDetails 인터페이스 implements 받았으니까!!
[출처]
https://cafe.naver.com/metacoding
메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9