본문 바로가기
공부/프로그래밍

[SpringBoot] (Spring Security) 로그인 후 호출했던 이전 페이지로 이동하기

by demonic_ 2018. 7. 6.
반응형

로그인 하고나서 이전 페이지로 이동하는 방법에 대해 알아보겠습니다.


여기서는 총 파일 3개를 수정 or 생성합니다.

LoginSuccessHandler.java // 로그인 완료 후 처리되는 핸들러 (AuthenticationSuccessHandler 인터페이스 구현)

SecurityConfig.java  // 스프링 시큐리티 설정파일

LoginController.java // '/login' URL 을 매핑하는 클래스



해당 기능을 구현할 경우 다음의 장단점이 있습니다.

- 장점. 로그인을 하고나서 전 페이지로 이동이 수월함

- 단점. 로그인이 필요한 서비스로 이동하다가 걸린경우,

     로그인 이후에 해당페이지로 이동하는게 아니라 호출한 페이지로 이동

     예) /main 에서 /admin 으로 접근하다가 로그인이 걸린건데, 

      설정하지 않으면 로그인 성공 후 /admin 으로 바로 접속되지만

      설정할 경우 로그인 성공 후 호출했던 /main 으로 이동.



그럼 구현방법에 대해 알아보겠습니다.



1. LoginSuccessHandler 구현

import lombok.extern.java.Log;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@Log
public class LoginSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
    public LoginSuccessHandler(String defaultTargetUrl) {
        setDefaultTargetUrl(defaultTargetUrl);
    }

    /**
     * 인증에 성공할 경우 아래 매서드로 이동.
     */
    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {
        HttpSession session = request.getSession();
        if (session != null) {
            String redirectUrl = (String) session.getAttribute("prevPage");
            if (redirectUrl != null) {
                session.removeAttribute("prevPage");
                getRedirectStrategy().sendRedirect(request, response, redirectUrl);
            } else {
                super.onAuthenticationSuccess(request, response, authentication);
            }
        } else {
            super.onAuthenticationSuccess(request, response, authentication);
        }
    }
}



2. Security Config 설정.

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .formLogin()
            .loginPage("/login")
            .successHandler(new LoginSuccessHandler("/")) 		// 이 부분이 중요.
            .permitAll()
            ...
    ;
}



3. LoginController 수정

@RequestMapping(path = {"/login"})
public String login(Model model){
		// 이전페이지 URL 추출
		String referrer = request.getHeader("Referer");
		request.getSession().setAttribute("prevPage", referrer);
    return "login";
}


반응형

댓글