AWS Key 노출 수정, 관리자 기능 수정, 회원탈퇴 문제 해결

뚜우웅이·2023년 8월 18일
0

SpringBoot웹

목록 보기
21/23

관리자 권한 작동하는지 확인하기

UPDATE user_role 
SET role_id = 2
WHERE user_id = 8

123456 계정 권한을 관리자로 변경해줍니다.

수정 권한 변경

다른 사용자 글을 수정은 못하지만 삭제는 가능하게 코드를 수정해줍니다.

<div class="text-right">
            <!--            <a class="btn btn-primary" th:href="@{/board/list}">목록으로</a>-->
            <a class="btn btn-primary" onclick="history.back()">목록으로</a>
            <a class="btn btn-primary" th:href="@{/board/form(id=*{id})}"
               th:if="${board.title != null and (board.user != null and #authentication.name == board.user.username)}">수정</a>
            <button class="btn btn-primary" th:if="${board.title != null and (#authorization.expression('hasAuthority(''ROLE_ADMIN'')') or (board.user != null and
             #authentication.name == board.user.username))}" th:onclick="|deleteBoard(*{id})|"
                    type="button">삭제
            </button>
        </div>

admin 사용자에게도 수정 버튼이 안 보이게 수정해줍니다.

@PreAuthorize("@boardService.isBoardAuthor(#id, authentication.name)")
    @PutMapping("/boards/{id}")
    Board replaceBoard(@RequestBody Board newBoard, @PathVariable Long id) {

        return boardRepository.findById(id).map(board -> {
            board.setTitle(newBoard.getTitle());
            board.setContent(newBoard.getContent());
            return boardRepository.save(board);
        }).orElseGet(() -> {
            newBoard.setId(id);
            return boardRepository.save(newBoard);
        });
    }

메소드 수준에서도 작성자만 게시글을 수정할 수 있도록 해줍니다.

파일이 업로드된 게시글 삭제 오류

파일이 업로드된 게시글의 경우에 관리자가 게시글을 삭제하려고 했을 때
Amazon S3에서 "Access Denied"이런 오류가 발생하여 삭제를 하지 못합니다.

개인 프로젝트여서 DB정보와 s3 key를 암호화하지 않고 application.properties에 바로 올려두어 문제가 발생했습니다. 현재 위의 오류가 뜨는 이유는 aws에서 key가 노출됐다는 것을 감지해 접근을 막아둔 것입니다.

이를 해결하기 위해서는 application.properties에 환경변수를 설정해줍니다.

application.properties 환경변수 설정

환경변수를 설정하기 전에 먼저 코드를 수정해줍니다.

spring.datasource.url=${DB_URL}
spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}
aws.access.key=${AWS_ACCESS_KEY}
aws.secret.key=${AWS_SECRET_KEY}

DB와 AWS등 민감한 정보들을 환경변수로 등록해줍니다.

IntelliJ에서 Edit Configurations에 들어가서 현재 프로젝트를 선택해준 뒤
Environment Variables를 클릭해줍니다.

각각의 이름에 맞게 Vaule를 설정해줍니다.

이미 aws key가 노출되었기 때문에 기존 키는 삭제 후 키를 재발급 받아서 적용해줍니다.

그 후 s3 사용자 권한 정책에서 AWSCompromisedKeyQuarantineV2 이 권한 정책을 삭제해줍니다.

이제 파일이 업로드 된 게시글이 정상적으로 삭제 되는 것을 확인할 수 있습니다.

회원탈퇴 문제 수정

회원탈퇴시 게시글과 댓글을 삭제하지 않아서 문제가 발생하고 있습니다.
먼저 게시글을 삭제하기 위해서 게시글 삭제 관련 코드를 생성해줍니다.

BoardRepository

	// user의 id값을 기준으로 게시글 삭제
	void deleteByUserId(Long userId);

BoardService

	public void deleteBoardByUserId(Long id){
        boardRepository.deleteByUserId(id);
    }

CommentRepository

void deleteByUserId(Long id);

CommentService

public void deleteByUserId(Long id){
        commentRepository.deleteByUserId(id);
    }

UserService

//회원 DB 삭제
    @Transactional //어노테이션을 사용하여 트랜잭션 범위 내에서 지연 로딩을 수행하는 방법
    public void deleteUser(User user) {
        deleteUserRoleByUserId(user.getId());
        boardService.deleteBoardByUserId(user.getId());
        commentService.deleteByUserId(user.getId());
        userRepository.delete(user);
    }

현재 이 코드로는 게시글과 댓글 등 DB 정보는 삭제가 되나 파일을 업로드한 게시글의 경우 s3에 파일이 업로드 되어 있어 삭제가 안 되는 문제가 있습니다.

파일 삭제 오류 해결

FileRepository

List<FileData> findByBoard(Board board);

BoardRepository

List<Board> findByUserId(Long userId);

BoardService

public List<String> getFileKeysByUserId(Long userId) {
        List<Board> boards = boardRepository.findByUserId(userId);

        List<String> fileKeys = new ArrayList<>();
        for (Board board : boards) {
            List<FileData> fileDataList = fileRepository.findByBoard(board);

            for (FileData fileData : fileDataList) {
                fileKeys.add(fileData.getFilepath());
            }
        }

        return fileKeys;
    }

이 코드는 주어진 userId에 해당하는 사용자가 작성한 게시글과 관련된 모든 파일 경로를 가져오는 코드입니다.
user id값으로 작성된 게시글 목록을 가져와서 해당 게시글과 연결된 파일 경로를 리스트에 추가해줍니다.

UserService

//회원 DB 삭제
    @Transactional //어노테이션을 사용하여 트랜잭션 범위 내에서 지연 로딩을 수행하는 방법
    public void deleteUser(User user) {
        List<String> fileKeys = boardService.getFileKeysByUserId(user.getId()); // 게시글에 올려둔 파일 키 목록을 가져옵니다.
        deleteUserRoleByUserId(user.getId());
        boardService.deleteBoardByUserId(user.getId());
        commentService.deleteByUserId(user.getId());
        userRepository.delete(user);
        deleteObjectsFromS3(fileKeys); // S3에서 해당 파일들을 삭제합니다.
    }

    private void deleteObjectsFromS3(List<String> fileKeys) {
        for (String fileKey : fileKeys) {
            amazonS3Client.deleteObject("myhomewebbucket", fileKey);
        }
    }


이제는 게시글 삭제시 s3에 업로드된 파일도 같이 삭제되는 것을 확인할 수 있습니다.

배포 환경 작동 확인

git에 올려둔 프로젝트를 가져와줍니다. 그 다음에
환경변수 설정을 위해 ec2 인스턴스에 연결을 한 뒤에
vi ~/.bashrc 명령어를 입력한 후 esc를 누른 후 o를 눌러 다음 줄에 환경변수를 설정해줍니다.

export DB_URL='your_db_url_here'
export DB_USERNAME='your_db_username_here'
export DB_PASSWORD='your_db_password_here'
export AWS_ACCESS_KEY='your_aws_access_key_here'
export AWS_SECRET_KEY='your_aws_secret_key_here'

위의 코드를 다 입력 후 esc을 누른 뒤 :wq!를 눌러 저장 후 빠져나옵니다.
그 후 source ~/.bashrc 이 명령어를 입력하여 변경된 프로파일을 다시 로드해줍니다.

./mvnw package 명령어를 사용하여 jar 파일을 다시 생성해줍니다.

target 폴더로 이동 후 java -jar jar파일 명령어로 서버를 구동시켜줍니다.

profile
공부하는 초보 개발자

0개의 댓글