스프링 시큐리티

Ch03. 실전프로젝트(인증 프로세스 Form 인증 구현) - 인증 거부 처리(Access Denied)

webmaster 2022. 1. 19. 13:09
728x90
  • 인증은 성공한 사용자가 자원에 접근할 권한이 없을 경우 ExceptionTranslateFilter에서 잡게 되고, CustomHandler를 실행시켜 줄 수가 있다.
  • CustomAccessDeniedHandler
    • 인증은 성공했으나 권한이 없는 사용자가 접근할 경우 해당 핸들러를 실행시켜준다.
    • 사용자가 접근할수 없는 URL인 것을 알려주고, 파라미터로 Exception을 전달하여 준다.
  • SecurityContext
    • Bean으로 등록하여 ErrorPageURL을 주입한다.
  • 인증에 성공한 뒤, 접근 권한이 없을 경우 /denied로 redirect 한다
    • 접근권한이 없음을 알려주는 페이지
    • denied.html
    • <!DOCTYPE html>
      <html lang="ko" xmlns:th="http://www.thymeleaf.org">
      <head th:replace="layout/header::userHead"></head>
      <body>
      <div th:replace="layout/top::header"></div>
      <div class="container">
          <div class="row align-items-start">
              <nav class="col-md-2 d-none d-md-block bg-light sidebar">
                  <div class="sidebar-sticky">
                      <ul class="nav flex-column">
                          <li class="nav-item">
                              <div style="padding-top:10px;" class="nav flex-column nav-pills" aria-orientation="vertical">
                                  <a th:href="@{/}" style="margin:5px;" class="nav-link  text-primary">대시보드</a>
                                  <a th:href="@{/mypage}" style="margin:5px;" class="nav-link text-primary">마이페이지</a>
                                  <a th:href="@{/messages}" style="margin:5px;" class="nav-link text-primary">메시지</a>
                                  <a th:href="@{/config}" style="margin:5px;" class="nav-link text-primary">환경설정</a>
                              </div>
                          </li>
                      </ul>
                  </div>
              </nav>
              <div style="padding-top:50px;"  class="col">
                  <div class="container text-center">
                      <h1><span th:text="${username}" class="alert alert-danger" />님은 접근 권한이 없습니다.</h1>
                      <br />
                      <h3 th:text="${exception}"></h3>
                  </div>
              </div>
          </div>
      </div>
      <div th:replace="layout/footer::footer"></div>
      </body>
      </html>
728x90