작성
·
147
·
수정됨
0
위와 같이 failureUrl 지정하지 않았을 경우에는
이렇게 애플리케이션 홈 화면이 잘 나타납니다.
그런데
이렇게 failureUrl 을 별도로 지정해주게 되면
홈 화면에서도 인증을 요구하고 인가 처리에 대한 설정이 무시되어 버립니다.
왜 이렇게 되는 것인가요? 강의에서 이 현상에 대해서는 별 말씀 없으셔서 혼란스럽네요.
답변 1
0
네 이 부분을 확인해 보니 약간 특이한 점이 있긴 합니다.
DefaultLoginPageGeneratingFilter.java
private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
boolean loginError = isErrorPage(request);
boolean logoutSuccess = isLogoutSuccess(request);
if (isLoginUrlRequest(request) || loginError || logoutSuccess) {
String loginPageHtml = generateLoginPageHtml(request, loginError, logoutSuccess);
response.setContentType("text/html;charset=UTF-8");
response.setContentLength(loginPageHtml.getBytes(StandardCharsets.UTF_8).length);
response.getWriter().write(loginPageHtml);
return;
}
chain.doFilter(request, response);
}
위 코드를 보시면
if (isLoginUrlRequest(request) || loginError || logoutSuccess) {
즉 분기문이 true 이면 무조건 로그인 페이지를 생성해서 클라이언트로 반환해 버리고 있습니다
위 조건에서 loginError 가 true 가 되는 상황은
formLogin(form -> form.failureUrl("/"));
로 설정을 했을 경우 failureUrl 과 현재 클라이언트의 요청 url 이 동일한 경우 (여기서는 "/") 강제로 로그인 페이지를 생성해서 클라이언트로 반환해 버리고 있네요..
그래서 아래와 같이 설정했다고 하더라도
.requestMatchers("/").permitAll()
DefaultLoginPageGeneratingFilter 가 먼저 로그인 페이지를 만들어서 처리해 버리니 "/" 로 가지 못하는 현상이 발생하고 있는 것 같습니다.
이 부분은 스프링 시큐리티가 강제하고 있는 것 같습니다.
그래서 만약 failureUrl 로 이동하기 위해서는
.formLogin(form -> form.failureHandler((request, response, exception) -> response.sendRedirect("/")));
와 같이 핸들러를 사용하면 됩니다.
제 기억에는 핸들러를 사용하지 않고도 되었던 것 같은데 이 부분은 저도 좀 더 확인이 필요할 것 같네요
좋은 답변 감사합니다.