7월 28일
게시물의 수정과 삭제는 브라우저에서는 로그인한 사용자만이 접근할 수 있지만,
사용자가 URL을 조작해서도 접근이 가능하기 때문에 화면과 Post방식으로 처리되는 부분에서 CSRF 토큰과 스프링 시큐리티를 적용해야함.
게시물의 수정과 삭제에서 신경쓰이는 부분은 게시물의 수정과 삭제는 현재 로그인한 사용자와 게시물의 작성자가 동일한 경우에만 할수 있다는것, @PreAuthorize 어노테이션을 이용하여 처리할 수 있음.
(1)modify.jsp 수정
스프링 시큐리티릐 태그 라이브러리를 사용할수 있도록 설정
post방식으로 처리되는 부분이므로 CSRF 토큰을 추가해야함
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
...생략...
<form role="form" action="/board/modify" method="post">
<input type='hidden' name="${_csrf.parameterName}" value="${_csrf.token}"/>
<input type='hidden' name='pageNum' value='${cri.pageNum}'>
<input type='hidden' name='amount' value='${cri.amount}'>
...생략...
<sec:authentication property="principal" var="pinfo"/>
<sec:authorize access="isAuthenticated()">
<c:if test="${pinfo.username eq board.writer}">
<button type="submit" data-oper='modify' class="btn btn-default" >Modify</button>
<button type="submit" data-oper='remove' class="btn btn-danger" >Remove</button>
</c:if>
</sec:authorize>
<button class="btn btn-info" data-oper='list'>list</button>
</div>
</form>
...생략...
(2)BoardController 에서의 제어
BoardController에서는 메서드를 실행하기 전에 로그인한 사용자와 현재 파라미터로 전달되는 작성자가 일치하는지 체크,
@PreAuthorize의 경우 문자열로 표현식을 지정할수 있음.
이때 컨트롤러에 전달되는 파라미터를 같이 사용 할수 있어서 유용하다.
삭제의 경우 기존에는 파라미터로 게시물의 번호 bno만을 받았지만, 작성자를 의미하는 writer를 같이 추가해서 @PreAuthorize 로 검사하도록 해야함
@PreAuthorize("principal.username == #writer")
@PostMapping("/remove")
public String remove(@RequestParam("bno") Long bno, Criteria cri, RedirectAttributes rttr, String writer) {
int count=service.remove(bno);
if(count==1) rttr.addFlashAttribute("result","success");
rttr.addAttribute("pageNum", cri.getPageNum());
rttr.addAttribute("amount", cri.getAmount());
return "redirect:/board/list";
}
파라미터로 writer가 추가된 부분과 해당 파라미터를 @PreAuthorize에서 '#writer'를 이용해서 체크한 부분입니다.
@PreAuthorize("principal.username == #board.writer")
@PostMapping("/modify")
public String modify(BoardVO board, Criteria cri, RedirectAttributes rttr) {
int count=service.modify(board);
if(count==1) rttr.addFlashAttribute("result","success");
rttr.addAttribute("pageNum", cri.getPageNum());
rttr.addAttribute("amount", cri.getAmount());
return "redirect:/board/list";
}