๐ ๊ธฐ๋ฅ ์ค๋ช
๊ฒ์๊ธ์ ๋ฑ๋กํ ๋, ๋น๋ฐ๊ธ ์ค์ ์ฒดํฌ๋ฅผ ํ ํ ๋ฑ๋กํ๋ฉด, ๊ฒ์๊ธ ๋ชฉ๋ก์์ ์๋ฌผ์ ์์ด์ฝ์ผ๋ก ๋น๋ฐ๊ธ ํ์๊ฐ ๋๊ณ , ์ด ๊ธ์ ์์ฑ์์ ๊ด๋ฆฌ์๋ง ์ฝ์ ์ ์๋ค. (๋ค๋ฅธ ํ์์ ์์ ๊ธ์ ๋ชฉ์ ํด๋ฆญ์กฐ์ฐจ ๋ชป ํจ.)
1. DB ํ ์ด๋ธ๊ณผ VO์ ๋น๋ฐ๊ธ ๊ด๋ จ ํ๋ ์ถ๊ฐ.
ํ ์ด๋ธ์ secret์ด๋ผ๋ ์ปฌ๋ผ๊ณผ vo์๋ boolean ํ์ ์ผ๋ก ํ๋๋ฅผ ์ถ๊ฐํ๋ค. ์๋ฐ์์ boolean ํ์ ์ด DB๋ก ๋ค์ด๊ฐ ๋ ์์์ 0, 1๋ก ๋ฐ๋์ด์ ๋ค์ด๊ฐ!
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BoardVO {
private Long bno; // ๊ธ๋ฒํธ
private String category; // ์ง๋ฃ ๊ตฌ๋ถ ์นดํ
๊ณ ๋ฆฌ
private String title; // ์ ๋ชฉ
private String content; // ๋ด์ฉ
private String writer; // ์์ฑ์
private Date regdate; // ๋ฑ๋ก์ผ
private int replyCnt; // ๋๊ธ์
private int hitCount; // ์กฐํ์
private boolean secret; // ๋น๋ฐ๊ธ ์ฌ๋ถ
private List<BoardAttachVO> attachList = new ArrayList<BoardAttachVO>(); // ์ฒจ๋ถํ์ผ ๋ชฉ๋ก
}
2. register.jsp ์ฒ๋ฆฌ (๊ธ ๋ฑ๋ก ํ์ด์ง)
<div class="form-check form-check-inline mt-3">
<input class="form-check-input" type="checkbox" name="secret" id="secret">
<label class="form-check-label">๋น๋ฐ๊ธ ์ค์ </label>
</div>
๐ท jsp์์ name๊ฐ์ ํ๋์ ๋ง์ถฐ์ค์ผ ํ๋ค.
๐ท checkbox ํ์
์ form์ผ๋ก ์ ์ก๋ ๋ ์์์ true/false๋ก ๋์ด๊ฐ๋ค!
3. list.jsp ์ฒ๋ฆฌ (๊ธ ๋ชฉ๋ก ํ์ด์ง)
<c:if test="${board.secret == true}">
<c:choose>
<c:when test="${board.writer eq member.vo.userid || member.authorities eq '[ROLE_ADMIN, ROLE_MEMBER]'}"> <!-- ์์ฑ์์ด๊ฑฐ๋ ๊ด๋ฆฌ์์ผ ๋ -->
<td><a href="get${pageMaker.cri.listLink}&bno=${board.bno}" class="text-secondary text-center"><i class="icofont-lock"></i><c:out value="${board.title}"/><span class="text-muted small"> [${board.replyCnt}]</span></a></td>
</c:when>
<c:otherwise>
<td class="text-secondary"><i class="icofont-lock"></i><c:out value="${board.title}"/><span class="text-muted small"> [${board.replyCnt}]</span></td>
</c:otherwise>
</c:choose>
</c:if>
๐ท ์ด ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ ํจ์จ์ ์ธ ์ฝ๋์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง.. ์ปจํธ๋กค๋ฌ์์ @Preauthorize๋ก ์ฒ๋ฆฌํด ๋ณด๋ ค ํ๋๋ฐ ์คํจํ๊ณ jsp์์ ํด๋ดค๋ค.
(์ฐธ๊ณ ๋ธ๋ก๊ทธ- https://chobopark.tistory.com/97)
๐ท ์ปจํธ๋กค๋ฌ์์ ๊ธ์ ์ฝ์ ์ ์๋ ๊ถํ์ ROLE_MEMBER ๋๋ ROLE_ADMIN์ผ๋ก ํด ๋ฌ์, jsp์์ board.writer eq member.vo.userid
์ด ์กฐ๊ฑด ํ๋๋ง ํด๋ ๊ด๋ฆฌ์๋ ๋น๋ฐ๊ธ์ ์ฝ์ ์ ์์ ์ค ์์๋๋ฐ jsp ์ฒ๋ฆฌ๊ฐ ์ฐ์ ์ธ ๊ฑด์ง... ๊ด๋ฆฌ์์์๋ ๋ค๋ฅธ ๊ณ์ ์ผ๋ก ์ด ๋น๋ฐ๊ธ์ ์ฝ์ ์ ์์๋ค.
๐ท 'jsp์์ ๊ถํ์ ๋ณด๋ฅผ ์ด๋ป๊ฒ ๊ฐ์ ธ์ฌ ์ ์์๊น'ํ๋ค๊ฐ ํ์ฌ ๋ก๊ทธ์ธํ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ Authentication ๋ก๊ทธ๋ฅผ ์ฐ์ด๋ณด๋, Collection ํ์
์ผ๋ก ๊ถํ ์ ๋ณด๊ฐ ๋ค์ด์์๋ค. ๊ทธ๋์ member.authorities eq '[ROLE_ADMIN, ROLE_MEMBER]'
์ด๋ฐ ์์ผ๋ก ์ ์ฉํด ๋ดค๋๋ฐ.. ๋๋ค!
4. BoardController ์ฒ๋ฆฌ
@GetMapping({"get", "modify"})
@PreAuthorize("hasRole('ROLE_MEMBER') || hasRole('ROLE_ADMIN')")
public void get(@RequestParam Long bno, @ModelAttribute("cri") Criteria cri, Model model) {
log.info("get or modify.....");
model.addAttribute("board", service.get(bno));
model.addAttribute("cri", cri);
}
๐ท @PreAuthorize๋ฅผ ์ด์ฉํด์ ์ปจํธ๋กค๋ฌ์์ ๋ค ์ฒ๋ฆฌํ ์ ์์ ์ค ์์๋๋ฐ... ์ฒ์ ํ๋ ์๊ฐ์ @PreAuthorize("principal.username == #boardVO.writer || #boardVO.secret == false || hasRole('ROLE_ADMIN')")
์ด์๋ค.
ํ์ง๋ง list์์ get์ผ๋ก ๋์ด์ฌ ๋, boardVO๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์์๊ธฐ ๋๋ฌธ์ ์คํจ!
๐ ๊ฒฐ๊ณผ
๊ด๋ฆฌ์ ๊ณ์ (admin99)์ ์ผ๋ฐ ํ์(test04)์ด ์ด ๋น๋ฐ๊ธ์ ์ด๋ํ ์ ์๊ณ
(๋ง์ฐ์ค ํฌ์ธํฐ๊ฐ ์บก์ณ๊ฐ ์ ๋๋คใ
ใ
) ์ผ๋ฐ ํ์์ธ test04๋ ํ์ธ์ด ์ด ๋น๋ฐ๊ธ์ ํด๋ฆญ์กฐ์ฐจ ํ ์ ์๋ค.