[12.19] 내일배움캠프[Spring] TIL-35

박상훈·2022년 12월 19일
0

내일배움캠프[TIL]

목록 보기
35/72

[12.19] 내일배움캠프[Spring] TIL-35

1. 기존의 Spring 숙련 과제 기능 추가하기

회원별 직급에 따른 분류(User, Admin)

회원 권한 부여하기 (ADMIN, USER) - ADMIN 회원은 모든 게시글, 댓글 수정 / 삭제 가능

  • 먼저 JWT에 회원의 정보에 role정보를 담아주어야 함으로 JwtUtil을 리펙토링 했다.

JwtUtil.java

   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();
    }

UserRoleEnum.java

package com.sparta.spartaboard.entity;

public enum UserRoleEnum {
    USER,  // 사용자 권한
    ADMIN  // 관리자 권한
}
  • Enum class의 선언으로 인해 UserEntity에 매핑하기

UserEntity.java

@Column(nullable = false)
@Enumerated(EnumType.STRING)
private UserRoleEnum userRoleEnum;
  • 관리자인지 그냥 유저인지는 회원가입시 정해지고, 회원가입시 관리자 키 값을 넣어 회원가입을 진행 한다면 ADMIN,아니라면 USERRole이 정해진다.

UserService.java(회원가입 부분)

   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);
    }

관리자 권한인 회원과 유저 권한인 회원의 가입

권한에 따른 수정과 삭제 작업(기존 다른 유저의 게시글 작성 전제)


BoardService(게시글 수정 부분)

@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;
    }

BoardService(게시글 삭제 부분)

    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;
    }
profile
기록하는 습관

0개의 댓글