느림보 개발
3. 접근 제한 메시지의 처리 본문
특정한 사용자가 로그인은 했지만 URI를 접근할 수 있는 권한이 없는 상황이 발생할 수도 있습니다. 이 경우에는 접근 제한 에러 메세지를 보게됩니다. 아래와 같이 member사용자가 admin페이지를 요청했을 때 처럼요.
security-context
스프링 시큐리티에서는 접근 제한에 대해서 AccessDeniedHandler를 직접 구현하거나 특정한 URI를 지정할 수 있습니다.
- <security:access-denied-handler> 는 ①org.springframework.security.web.access.AccessDeniedHandler 인터페이스의 구현체를 지정하거나 ②error-page를 지정할 수 있습니다. 아래는 url로 접근 제한시 보이는 화면을 처리합니다.
.. 생략
<!-- 접근 제한시 처리 -->
<security:access-denied-handler error-page="/accessError"/>
</security:http>
CommonController
- 컨트롤러를 생성하여 /accessError를 처리하도록 지정합니다.
@Log4j
@Controller
public class CommonController {
private static final Logger log = LoggerFactory.getLogger(CommonController.class);
@GetMapping("/accessError")
public void accessDenied(Authentication auth, Model model) {
log.info("access Denied :: "+auth);
model.addAttribute("msg", "Access Denied");
}
}
accessError
- 에러 페이지
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1 style="background-color:orange;">accessError.jsp - 접근이 거부되었습니다. </h1>
<div style="background-color:yellow; ">
관리자에게 문의하세요.<br>
${msg }<br>
${SPRING_SECURITY_403_EXCEPTION.getMessage() }</div>
</body>
</html>
실행시
주소창 주목 -!!!
CustomAccessDeniedHandler
- 위와같이 URI만 제공할 경우 경로가 /sample/admin으로 뷰와 일치하지 않습니다. 사용자는 admin에 접속됐구나 라고 생각할 수 있습니다.
- 접근 제한이 된 경우에 다양한 처리를 하고 싶다면 AccessDeniedHandler 인터페이스를 구현하는 것을 권장합니다.
- security 패키지 생성하고 클래스를 추가합니다.
- AccessDeniedHandler 인터페이스를 직접 구현합니다. 인터페이스의 메서드는 handle() 뿐이기 때문이고, HttpServletRequest, HttpServletResponse를 파라미터로 사용하기 때문에 직접적으로 서블릿 API를 이용하는 처리가 가능합니다.
@Log4j
public class CustomAccessDeniedHandler implements AccessDeniedHandler {
private static final Logger log = LoggerFactory.getLogger(CustomAccessDeniedHandler.class);
@Override
public void handle(HttpServletRequest request, HttpServletResponse response,
AccessDeniedException accessDeniedException) throws IOException, ServletException {
log.info("Access Denied Handelr");
log.info("Redirect....");
response.sendRedirect("/accessError");
}
}
security-context
- error-page 속성 대신에 CustomAccessDeniedHandler 를 빈으로 등록해서 사용합니다.
- error-page 속성과 ref 속성 중 둘중 하나만을 사용합니다.
<bean id="customAccessDenied"
class="com.ddd.security.CustomAccessDeniedHandler"></bean>
... 생략
<!-- 접근 제한시 처리 url방식, 인터페이스방식-->
<!--<security:access-denied-handler error-page="/accessError"/> -->
<security:access-denied-handler ref="customAccessDenied"/>
실행시
주소줄의 경로가 /accessError로 바뀐 것을 확인할 수 있습니다.
참고
코드로 배우는 스프링 웹 프로젝트 개정판 - 구멍가게 코딩단 -
'코드 정리 > Spring Security' 카테고리의 다른 글
6. 로그아웃 (0) | 2023.01.21 |
---|---|
5. 로그인 후 출력할 페이지 설정 (0) | 2023.01.20 |
4. 커스텀 로그인 페이지 (0) | 2023.01.18 |
2. 접근 제한 설정 및 여러 권한을 가지는 사용자 설정 (0) | 2023.01.16 |
1. 스프링 시큐리티 기본 설정 (0) | 2023.01.14 |