느림보 개발

3. 접근 제한 메시지의 처리 본문

코드 정리/Spring Security

3. 접근 제한 메시지의 처리

@르르 2023. 1. 17. 10:24

 

특정한 사용자가 로그인은 했지만 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로 바뀐 것을 확인할 수 있습니다. 

 

 

 

 

 

 

더보기

참고 

코드로 배우는 스프링 웹 프로젝트 개정판 - 구멍가게 코딩단 -

 

Comments