반응형
게시글 상세보기에서 수정 삭제 버튼이 페이지의 주인일 때만 보이도록 설정해줘야 한다.
로그인 한 유저가 게시글을 쓴 유저와 동일한지 체크해야 한다.
게시글 상세보기 서비스에서 체크해주자.
원래 상세보기 서비스에서는 postEntity를 리턴해주고 있다.
주인인지 아닌지 true, false를 같이 리턴해주기 위해 Dto를 만들어주자.
package site.metacoding.blogv3.web.dto.post;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import site.metacoding.blogv3.domain.post.Post;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class PostDetailRespDto {
private Post post;
private boolean isPageOwner;
}
1. 해당 페이지의 postId 찾기
2. 해당 페이지의 주인 userId 찾기
3. 로그인한 유저의 userId 찾기
4. 2와 3을 비교해서 동일하면 isPageOwner에 true 추가
@Transactional
public PostDetailRespDto 게시글상세보기(Integer id, User principal) {
PostDetailRespDto postDetailRespDto = new PostDetailRespDto();
// 해당 페이지의 postId가 무엇인지 알아야함
Integer postId = id;
// 해당 페이지의 주인 userId가 무엇인지 알아야함
Integer pageOwnerId = null;
// 로그인 한 사용자의 userId가 무엇인지 알아야함
Integer loginUserId = principal.getId();
Optional<Post> postOp = postRepository.findById(id);
if (postOp.isPresent()) {
Post postEntity = postOp.get();
postDetailRespDto.setPost(postEntity);
pageOwnerId = postEntity.getUser().getId();
// 두 값을 비교해서 동일하면 isPageOwner에 true 추가
if (pageOwnerId == loginUserId) {
postDetailRespDto.setPageOwner(true);
} else {
postDetailRespDto.setPageOwner(false);
}
return postDetailRespDto;
} else {
throw new CustomException("해당 게시글을 찾을 수 없습니다");
}
}
@GetMapping("/post/{id}")
public String detail(@PathVariable Integer id, Model model, @AuthenticationPrincipal LoginUser loginUser) {
postDetailRespDto = postService.게시글상세보기(id, loginUser.getUser());
model.addAttribute("data", postDetailRespDto);
return "/post/detail";
}
권한 체크는 정상적으로 잘 동작하지만 로그인하지 않고 상세보기를 할 때
@AuthenticationPrincipal의 loginUser가 null이기 때문에 오류가 발생한다.
게시글상세보기 메서드를 오버로딩시켜 해결해주자.
@GetMapping("/post/{id}")
public String detail(@PathVariable Integer id, Model model, @AuthenticationPrincipal LoginUser loginUser) {
PostDetailRespDto postDetailRespDto = null;
if (loginUser == null) {
postDetailRespDto = postService.게시글상세보기(id);
} else {
postDetailRespDto = postService.게시글상세보기(id, loginUser.getUser());
}
model.addAttribute("data", postDetailRespDto);
return "/post/detail";
}
@Transactional
public PostDetailRespDto 게시글상세보기(Integer id) {
PostDetailRespDto postDetailRespDto = new PostDetailRespDto();
Optional<Post> postOp = postRepository.findById(id);
if (postOp.isPresent()) {
Post postEntity = postOp.get();
postDetailRespDto.setPost(postEntity);
// false로 세팅
postDetailRespDto.setPageOwner(false);
return postDetailRespDto;
} else {
throw new CustomException("해당 게시글을 찾을 수 없습니다");
}
}
[출처]
https://cafe.naver.com/metacoding
메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9
반응형