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에 환경변수를 설정해줍니다.
환경변수를 설정하기 전에 먼저 코드를 수정해줍니다.
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
이 권한 정책을 삭제해줍니다.
이제 파일이 업로드 된 게시글이 정상적으로 삭제 되는 것을 확인할 수 있습니다.
회원탈퇴시 게시글과 댓글을 삭제하지 않아서 문제가 발생하고 있습니다.
먼저 게시글을 삭제하기 위해서 게시글 삭제 관련 코드를 생성해줍니다.
// user의 id값을 기준으로 게시글 삭제
void deleteByUserId(Long userId);
public void deleteBoardByUserId(Long id){
boardRepository.deleteByUserId(id);
}
void deleteByUserId(Long id);
public void deleteByUserId(Long id){
commentRepository.deleteByUserId(id);
}
//회원 DB 삭제
@Transactional //어노테이션을 사용하여 트랜잭션 범위 내에서 지연 로딩을 수행하는 방법
public void deleteUser(User user) {
deleteUserRoleByUserId(user.getId());
boardService.deleteBoardByUserId(user.getId());
commentService.deleteByUserId(user.getId());
userRepository.delete(user);
}
현재 이 코드로는 게시글과 댓글 등 DB 정보는 삭제가 되나 파일을 업로드한 게시글의 경우 s3에 파일이 업로드 되어 있어 삭제가 안 되는 문제가 있습니다.
List<FileData> findByBoard(Board board);
List<Board> findByUserId(Long userId);
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값으로 작성된 게시글 목록을 가져와서 해당 게시글과 연결된 파일 경로를 리스트에 추가해줍니다.
//회원 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파일
명령어로 서버를 구동시켜줍니다.