- 먼저
JWT
에 회원의 정보에role
정보를 담아주어야 함으로JwtUtil
을 리펙토링 했다.
public String createToken(String username, UserRoleEnum role) {
Date date = new Date();
return BEARER_PREFIX +
Jwts.builder()
.setSubject(username)
.claim(AUTHORIZATION_KEY, role) // 이 부분!!
.setExpiration(new Date(date.getTime() + TOKEN_TIME))
.setIssuedAt(date)
.signWith(key, signatureAlgorithm)
.compact();
}
package com.sparta.spartaboard.entity;
public enum UserRoleEnum {
USER, // 사용자 권한
ADMIN // 관리자 권한
}
Enum class
의 선언으로 인해UserEntity
에 매핑하기
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private UserRoleEnum userRoleEnum;
- 관리자인지 그냥 유저인지는 회원가입시 정해지고, 회원가입시 관리자 키 값을 넣어 회원가입을 진행 한다면
ADMIN
,아니라면USER
로Role
이 정해진다.
private static final String ADMIN_TOKEN = "AAABnvxRVklrnYxKZ0aHgTBcXukeZygoC";
public ResponseEntity signup(SignUpRequestDto signUpDto){
String username = signUpDto.getUsername();
// 회원 중복 확인
Optional<User> found = userRepository.findByUsername(username);
if (found.isPresent()) {
throw new IllegalArgumentException("중복된 사용자가 존재합니다.");
}
if(signUpDto.getAdminToken().equals(ADMIN_TOKEN)){
signUpDto.setUserRoleEnum(UserRoleEnum.ADMIN);
}else{
signUpDto.setUserRoleEnum(UserRoleEnum.USER);
}
User user = new User(signUpDto);
userRepository.save(user);
SignUpAndLoginResponseDto signUpAndLoginResponseDto = new SignUpAndLoginResponseDto();
signUpAndLoginResponseDto.setMsg("회원가입 완료!");
signUpAndLoginResponseDto.setStatusCode(HttpStatus.OK.value());
return ResponseEntity.status(HttpStatus.OK).body(signUpAndLoginResponseDto);
}
@Transactional
public Board update(Long id, BoardRequestDTO boardDto, HttpServletRequest request) {
// Request에서 Token 가져오기
String token = jwtUtil.resolveToken(request);
Claims claims;
//선택한 게시글 찾기
Board board = boardRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("수정하고자 하는 게시글이 없습니다!")
);
// 토큰이 있는 경우에만 게시글 수정 가능
if (token != null) {
// Token 검증
if (jwtUtil.validateToken(token)) {
// 토큰에서 사용자 정보 가져오기
claims = jwtUtil.getUserInfoFromToken(token);
} else {
throw new IllegalArgumentException("Token Error");
}
// 토큰에서 가져온 사용자 정보를 사용하여 DB 조회
User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
() -> new IllegalArgumentException("사용자가 존재하지 않습니다.")
);
if (board.getUser().getId() == user.getId() || user.getUserRoleEnum().equals(UserRoleEnum.ADMIN)) {
board.update(boardDto);
return board;
}else{
throw new IllegalArgumentException("해당 사용자 혹은 관리자가 아니면 게시글을 수정할 수 없습니다!");
}
}
return null;
}
public ResponseEntity delete(Long id, BoardRequestDTO boardDto, HttpServletRequest request) {
// Request에서 Token 가져오기
String token = jwtUtil.resolveToken(request);
Claims claims;
Board board = boardRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("삭제하고자 하는 게시글이 없습니다!")
);
if (token != null) {
// Token 검증
if (jwtUtil.validateToken(token)) {
// 토큰에서 사용자 정보 가져오기
claims = jwtUtil.getUserInfoFromToken(token);
} else {
throw new IllegalArgumentException("Token Error");
}
// 토큰에서 가져온 사용자 정보를 사용하여 DB 조회
User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
() -> new IllegalArgumentException("사용자가 존재하지 않습니다.")
);
if (board.getUser().getId() == user.getId() || user.getUserRoleEnum().equals(UserRoleEnum.ADMIN)) {
boardRepository.deleteById(id);
DeleteResponseDto deleteResponseDto = new DeleteResponseDto();
deleteResponseDto.setMsg("게시글 삭제 성공!");
deleteResponseDto.setStatusCode(HttpStatus.OK.value());
return ResponseEntity.status(HttpStatus.OK).body(deleteResponseDto);
}else{
throw new IllegalArgumentException("해당 사용자 혹은 관리자가 아니면 게시글을 삭제할 수 없습니다!");
}
}
return null;
}
- Git : https://github.com/PriceHoon/spartaBoard
- 내일 작업 : 댓글 기능 추가작업 예정.