Loading...

Spring/Tistory / / 2022. 4. 29. 10:01

블로그-V3. 게시글 상세보기 페이지 권한

반응형

게시글 상세보기에서 수정 삭제 버튼이 페이지의 주인일 때만 보이도록 설정해줘야 한다.

로그인 한 유저가 게시글을 쓴 유저와 동일한지 체크해야 한다.

게시글 상세보기 서비스에서 체크해주자.

 

원래 상세보기 서비스에서는 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

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 
반응형