[개인 프로젝트] 11일차 회고

·2024년 7월 30일

개인 프로젝트

목록 보기
12/16
post-thumbnail

오늘의 회고록

  • 오늘은 Post와 Comment에 @PreAuthorize 권한을 설정해주었다.
    자세한 사용 내용은 아래 정리해두었다.
  • 공지사항 기능과 스크랩 기능을 개발했다.
  • 공지사항 기능 개발은 금방 끝냈는데 스크랩 기능 개발이 좀 어려웠다.
    처음엔 스크랩 엔티티에 isScrapped 컬럼을 넣어서 스크랩을 누르거나 취소할 때마다 put으로 수정해주면 될거라 생각했는데 service에서 repository에 저장할 때 좀 복잡해져서, post를 사용해 스크랩이 존재하면 삭제하고, 존재하지 않으면 생성하는 방식으로 방법을 바꿨다.
  • 오늘로써 일단 계획된 1차 api개발은 끝냈다. 그런데 아직 테스트 코드 작성을 안해서 연동 후 배포 전에 테스트 코드를 싹 작성할 예정이다. 원래 개발하면서 그때그때 테스트 코드를 작성하기로 다짐했는데 api개발하는데 급급해버려서.. 조금 아쉽다.

@PreAuthorize 사용 예시 정리

  • SpEL 표현식 사용
  • '현재 로그인 된 유저의 userId가 수정하려는 post의 userId와 일치하는가? 또는 어드민 권한을 가지고 있는가?'

@PreAuthorize 403 Forbidden 에러

  • 작성자만 수정할 수 있게 하는 로직은 잘 적용되는데, hasRole('ADMIN') 로직은 관리자로 로그인해서 수정하려고 했음에도 계속 권한이 없다는 에러가 났다.
  • SecurityConfig에 @EnableMethodSecurity 추가 완료인 상태.
  • Role ENUM 클래스에 "ROLE_ADMIN" 으로 잘 저장되어있음..

뭐가 문제인지 계속 찾아봤다.
근데 나 같은 경우가 정말 없어서 3시간동안 삽질하다가.. 결국 Admin 권한 체크 부분도 SpEL 표현식으로 바꿔주었다.

	// 게시글 수정
    @PutMapping("/posts/{postId}")
    @PreAuthorize("(#customUserDetails.authorities.containsAll(@postService.getPostAuthorAuth())) or (#customUserDetails.userId == @postService.getPostAuthorId(#postId))")
    public ResponseEntity<PostResponse> updatePost(@PathVariable Long postId,
                                                   @RequestBody @Valid PostUpdateRequest request,
                                                   @AuthenticationPrincipal CustomUserDetails customUserDetails) {
        Post updatedPost = postService.update(postId, request);

        return ResponseEntity
                .ok(updatedPost.toResponse());
    }
  • customUesrDetails.authorities가 Collection 형태의 roleName을 뱉기 때문에 postService에서 ROLE_ADMIN 권한을 가져오는 로직을 짤 때, customUesrDetails.authorities 와 똑같은 형태로 리턴하도록 했다.
	// ROLE_ADMIN 반환하는 메서드 - 권한 체크용
    public Collection<GrantedAuthority> getPostAuthorAuth() {
        Collection<GrantedAuthority> role = new ArrayList<>();
        role.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
        return role;
    }

  • 드디어.. 드디어 admin 권한을 가진 사람과 작성자만 글을 수정할 수 있게 되었다.
    누군가 나와 같은 문제를 겪으며 찾다찾다 여기까지 들어왔다면 꼭 해결됐길 바란다.

내일 할 일

  • 내일은 두려운 html 연동 작업에 들어가야한다. 왜 두렵냐면 javaScript에 자신이 없기 때문에 두렵다.. 프로젝트 할 때마다 연동 작업이 제일 힘들었다.
    그래도 파이팅!! 개인 프로젝트라 나 아니면 할 사람도 없다.
profile
꾸준히 성장하자!

0개의 댓글