Spring Framework-12

🚧이제 작성자가 아니면 수정, 삭제를 못하도록 막아보자!


post.jsp 수정

아래와 같이 JSTL c:if 태그를 사용해서 userSession에 저장되있는 email과 글의 작성자의 email이 다르다면 수정, 삭제 버튼이 보이지 않도록 수정합니다.

<c:if test="${userSession == post.user.email}">
	<c:choose>
		<c:when test="${!isModify}">
			<a id="modify" href="/post/${post.id}?isModify=true" class="btn btn-primary btn-user btn-block">
                                                    Modify
			</a>
		</c:when>
		<c:otherwise>
			<a id="modifySubmit" class="btn btn-primary btn-user btn-block">
                                                    Submit
			</a>
		</c:otherwise>
	</c:choose>
	<a id="delete" class="btn btn-danger btn-user btn-block">
                                            Delete
	</a>
</c:if>

PostInterceptor 추가

버튼만 막는다고 요청을 보낼 수 없는 것은 아닙니다. postman과 같은 도구로 부적절한 경로로 요청을 보낼 수도 있습니다. 따라서 이를 막아야합니다. 이를 막는 방법은 여러가지가 있겠지만 저번에 했던 것 처럼 Interceptor를 통해 막아보도록 하겠습니다. /post로 오는 모든 경로를 막을 순 없기에 조건문으로 구분하여 처리 하도록 합니다. 조건은 PUT, DELETE로 요청이 들어오거나 또는 GET요청으로 들어오고 &isModify가 true글 수정 페이지를 요청할 때 interceptor가 처리하도록 합니다. 처리는 session에서 email을 받고 uri에서 postId부분을 가져와 DB에서 글 정보를 가져오고 이와 비교해서 작성자인지 확인하는 처리입니다. 만약 작성자가 아니라면 /boardredirect합니다.

public class PostInterceptor implements HandlerInterceptor {
    private PostService postService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String uri = request.getRequestURI();// ex) /post/1
        HttpSession session = request.getSession();
        /*
            우선순위 때문인지 의존성 주입이 되지 않아 postService가 null이 된다.
            따라서 직접 설정에서 PostService 클래스의 빈을 가져와 넣어준다.
        * */
        if(postService==null){
            WebApplicationContext context =
                    WebApplicationContextUtils.getWebApplicationContext(session.getServletContext());
            postService = context.getBean(PostService.class);
        }

        if (request.getMethod().equals("PUT") || request.getMethod().equals("DELETE") ||
                (request.getMethod().equals("GET") && request.getParameter("isModify")!=null &&request.getParameter("isModify").equals("true"))) {
            String email = (String) session.getAttribute("userSession");
            String tmp= new String();
            /*
		여러 방법이 있겠지만 가장 간단하게 마지막 / 뒤에 postId가 있으므로
        	그 위치부터 char를 받아와서 숫자일 때까지 tmp에 더하여 형변환하면
            	간단히 postId를 uri로부터 얻을 수 있다.
            */
            for(int i=uri.lastIndexOf("/")+1; i<uri.length(); i++){
                if(uri.charAt(i)>='0' && uri.charAt(i)<='9')
                    tmp+=uri.charAt(i);
            }
            int postId=Integer.valueOf(tmp);
            boolean result = postService.findById(postId).getUser().getEmail().equals(email);

            if(!result)
                response.sendRedirect("/board");

            return result;
        }

        return true;
    }
}

ServletConfig 수정

ServletConfig에서 interceptor를 추가해줍니다.

@Override
public void addInterceptors(InterceptorRegistry registry) {
	WebMvcConfigurer.super.addInterceptors(registry);
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/board","/post/**");
        registry.addInterceptor(new PostInterceptor()).addPathPatterns("/post/**");
}

테스트

로그로 확인해보겠습니다. 테스트를 하고 싶으신 분들은 post.jspc:if 태그를 제거하고 나서 테스트해보시면 됩니다.


좋은 웹페이지 즐겨찾기