Loading...

Spring/Tistory / / 2022. 4. 26. 23:12

블로그-V3. successHandler

반응형

스프링 부트 시큐리티는 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

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

 

반응형