Spring
스프링 시큐리티로 로그인 이후에 현재 페이지로 되돌아오는 방법
기억용블로그
2022. 5. 26. 11:38
728x90
타임리프에서 아래와 같이 input을 받고 action으로 값을 올려준다.
<form method="get" th:action="@{/auth/login}">
<div sec:authorize="!isAuthenticated()">
<input type="hidden" th:name="requestURI" th:value="${#httpServletRequest.requestURI}">
<button class="btn btn-outline-dark">
<i class="fas fa-shopping-cart"></i>
장바구니
</button>
<button class="btn btn-outline-dark">
<i class="fas fa-cash-register"></i>
바로구매
</button>
</div>
</form>
해당 이름을 파라미터로 받는다. GET 요청이므로 body는 사용하지 않는 것이 좋다.
@GetMapping("/login")
public String login(@RequestParam(name = "requestURI", required = false) String requestURI, HttpServletRequest request, @CurrentUser User user) {
request.getSession().setAttribute("requestURI", requestURI);
if (user != null) {
return "redirect:/";
}
return "auth/login";
}
loginSuccessHandler에서 하나의 더 분기점을 만들어 세션에 해당하는 URI가 있다면
redirectStrategy를 URI로 가게하고 세션에 남은 URI를 제거.
protected void resultRedirectStrategy(final HttpServletRequest request,
final HttpServletResponse response,
final Authentication authentication) throws IOException, ServletException {
SavedRequest savedRequest = (SavedRequest) request.getSession().getAttribute("SPRING_SECURITY_SAVED_REQUEST");
if (authentication.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_ADMIN"))) {
redirectStrategy.sendRedirect(request, response, "/admin");
----------------------------------------------------------------
} else if (request.getSession().getAttribute("requestURI") != null) {
String requestURI = (String) request.getSession().getAttribute("requestURI");
redirectStrategy.sendRedirect(request, response, requestURI);
request.getSession().removeAttribute("requestURI");
}----------------------------------------------------------------
else if (savedRequest != null) {
String targetUrl = savedRequest.getRedirectUrl();
redirectStrategy.sendRedirect(request, response, targetUrl);
} else {
redirectStrategy.sendRedirect(request, response, defaultUrl);
}
}