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에서 글 정보를 가져오고 이와 비교해서 작성자인지 확인하는 처리입니다. 만약 작성자가 아니라면 /board로 redirect합니다.
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.jsp의 c:if 태그를 제거하고 나서 테스트해보시면 됩니다.
Author And Source
이 문제에 관하여(Spring Framework-12), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dbghwns11/Spring-Framework-12저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)