25. 인증 및 권한 처리하기v4

송민경's avatar
Mar 15, 2024
25. 인증 및 권한 처리하기v4

1. 회원가입

  • 인증이 필요 없음
  • 터질 가능성 : 이미 회원 가입되어있는 아이디로 가입할 경우 / 무결성 제약조건 위배
@PostMapping("/join") public String join(UserRequest.JoinDTO reqDTO) throws Exception { try { userRepository.save(reqDTO.toEntity()); } catch (DataIntegrityViolationException e){ throw new Exception400("동일한 유저네임이 존재합니다."); } return "redirect:/"; }
notion image
 

2. 로그인

  • 터질 가능성 : 아이디 혹은 비밀번호가 다를 경우
@PostMapping("/login") public String login(UserRequest.LoginDTO reqDTO) { try{ User sessionUser = userRepository.findByUsernameAndPassword(reqDTO); session.setAttribute("sessionUser", sessionUser); return "redirect:/"; }catch (EmptyResultDataAccessException e) { throw new Exception401("유저네임 혹은 비밀번호가 틀렸어요"); } }
notion image
 

3. 글 수정하기

  • 터질 가능성 : 기본(255자)이상 들어올 수 있음
@PostMapping("/board/{id}/update") public String update(@PathVariable Integer id, BoardRequest.UpdateDTO reqDTO) { User sessionUser = (User) session.getAttribute("sessionUser"); Board board = boardRepository.findById(id); if(sessionUser.getId() != board.getUser().getId()){ throw new Exception403("게시글을 수정할 권한이 없습니다"); } boardRepository.updateById(id, reqDTO.getTitle(), reqDTO.getContent()); return "redirect:/board/" + id; }
notion image
 

4. 글 수정페이지 이동하기

  • 터질 가능성 : 주소를 입력해서 없는 페이지로 갈 수 없음
@GetMapping("/board/{id}/update-form") public String updateForm(@PathVariable(name = "id") Integer id, HttpServletRequest request) { Board board = boardRepository.findById(id); if(board == null) { throw new Exception404("해당 게시글을 찾을 수 없습니다"); } request.setAttribute("board", board); return "/board/update-form"; // 서버가 내부적으로 index를 요청 - 외부에서는 다이렉트 접근이 안됨 }
notion image
 

5. 글 삭제하기

@PostMapping("/board/{id}/delete") public String delete(@PathVariable Integer id) { User sessionUser = (User) session.getAttribute("sessionUser"); Board board = boardRepository.findById(id); if(sessionUser.getId() != board.getUser().getId()){ throw new Exception403("게시글을 삭제할 권한이 없습니다"); } boardRepository.deleteById(id); return "redirect:/"; }
notion image
 

6. 게시글 상세보기

  • 터질 가능성 : 로그인을 하고 수정, 삭제 버튼이 보여야 함
  • 게시글 주인 : true 아니면 false
@GetMapping("/board/{id}") public String detail(@PathVariable Integer id, HttpServletRequest request) { User sessionUser = (User) session.getAttribute("sessionUser"); Board board = boardRepository.findByIdJoinUser(id); // 로그인을 하고, 게시글의 주인이면 isOwner가 true가 된다. boolean isOwner = false; if(sessionUser != null){ if(sessionUser.getId() == board.getUser().getId()){ isOwner = true; } } request.setAttribute("isOwner", isOwner); request.setAttribute("board", board); return "board/detail"; }
{{> /layout/header}} <div class="container p-5"> {{#isOwner}} <!-- 수정삭제버튼 --> <div class="d-flex justify-content-end"> <!-- Post 요청-> 해당 페이지로 이동--> <a href="/board/{{board.id}}/update-form" class="btn btn-warning me-1">수정</a> <!-- Post 요청 -> 해당 페이지 삭제 --> <form action="/board/{{board.id}}/delete" method="post"> <button class="btn btn-danger">삭제</button> </form> </div> {{/isOwner}} <div class="d-flex justify-content-end"> <b>작성자</b> : {{board.user.username}} </div> <!-- 게시글내용 --> <div> <h2><b>{{board.title}}</b></h2> <hr/> <div class="m-4 p-2"> {{board.content}} </div> </div> <!-- 댓글 --> <div class="card mt-3"> <!-- 댓글등록 --> <div class="card-body"> <form action="/reply/save" method="post"> <textarea class="form-control" rows="2" name="comment"></textarea> <div class="d-flex justify-content-end"> <button type="submit" class="btn btn-outline-primary mt-1">댓글등록</button> </div> </form> </div> <!-- 댓글목록 --> <div class="card-footer"> <b>댓글리스트</b> </div> <div class="list-group"> <!-- 댓글아이템 --> <div class="list-group-item d-flex justify-content-between align-items-center"> <div class="d-flex"> <div class="px-1 me-1 bg-primary text-white rounded">cos</div> <div>댓글 내용입니다</div> </div> <form action="/reply/1/delete" method="post"> <button class="btn">🗑</button> </form> </div> <!-- 댓글아이템 --> <div class="list-group-item d-flex justify-content-between align-items-center"> <div class="d-flex"> <div class="px-1 me-1 bg-primary text-white rounded">ssar</div> <div>댓글 내용입니다</div> </div> <form action="/reply/1/delete" method="post"> <button class="btn">🗑</button> </form> </div> </div> </div> </div> {{> /layout/footer}}
notion image
notion image
notion image
 
Share article

vosw1