2023.07.19.수.TIL

heeh·2023년 7월 19일

TIL

목록 보기
46/82
post-thumbnail

2023.07.19.수

팀프로젝트

  • getMapping-조회
    • id 값 추가
    • password 값 삭제
  • 생성자 불러오려면 기본 생성자 필요
    • @NoArgsConstructor로 기본 생성자 필요한 것 만들어주는
    • public class ProfileUpdateDto
  • UserController - ProfileUpdateDto를 MsgResoponseDto로 감싸주기
  • PasswordRequestDto 삭제하기
    • profileUpdateDto에서 password를 이미 받고 있음!
  • PasswordEncoder.matches 로 이미 인코더 - 암호화가 되기 때문에 다른 인코더 설정은 삭제하기!
  • 엔티티 유저의 업데이트프로필 메서드에 패스워드를 저장하게 되면 패스워드가 암호화가 되지 않고 평문으로 반환됨 - 삭제하기!
    • UserService의 관련 코드 수정하기
  • ResponseEntity 변수명 ()
    public ResponseEntity<MsgResponseDto> profileUpdateDto ()
    • ResponseEntity은 MsgResponseDto의 타입으로 반환해준다
    • 리턴은
      return ResponseEntity.ok().body(new MsgResponseDto("프로필 수정 성공", HttpStatus.CREATED.value()));
  • 디벨롭 SQL 비밀번호 : ??????
  • matches
    • 번째 인자로 암호화되지 않은 비밀번호를, 두 번째 인자로는 암호화된 비밀번호를 받아 비교

      if (passwordEncoder.matches(passwordRequestDto.getUserPassword(), user.getUserPassword()))
    • 암호화 되지 않은 비밀번호 passwordRequestDto.getUserPassword()

    • 암호화 된 비밀번호 user.getUserPassword()

    • 입력된 비밀번호와 현재 사용자의 암호화된 비밀번호가 일치하지 않는지를 확인하는 조건문

    • 왼쪽 자리는 입력된 비밀번호이고, 오른쪽 자리는 현재 사용자의 암호화된 비밀번호

    • passwordEncoder.matches() 메서드는 첫 번째 인자로 입력된 비밀번호를, 두 번째 인자로는 현재 사용자의 암호화된 비밀번호를 받아 비교

    • 왼쪽 자리인 profileUpdateDto.getUserPassword()는 입력된 비밀번호이고, 오른쪽 자리인 userDetails.getPassword()는 현재 사용자의 암호화된 비밀번호

    • 잘못 작성하여 인한 혼돈…. 왼쪽이 암호화 된 비밀번호, 오른쪽이 암호화 되지 않은 비밀번호로 잘못 작성했었다

  • 프로필 수정 전 비밀 검증 메서드 추가
  • 비밀번호 변경 시 최근 3번 사용한 비밀번호는 사용 제한하기
    • Entity PasswordHistory, PasswordHistoryRepository 추가
    • PasswordHistoryRepository에 findTop3ByUserOrderByCreatedAtDesc라는 메서드 추가
      → List에서 시간 순서대로 3가지를 찾는다…?! (비밀번호 문구를 안 넣어줘도 되나…)
    • UserService에서 public ProfileUpdateDto updateProfile에 최근 3번 사용한 비밀번호 조회와 최근 3번 사용한 비밀번호 제한하기를 추가
      • PasswordHistory passwordHistory = passwordHistories.get(i); 의 의미
        → passwordHistories에 있는 i를 passwordHistory에 주입 받는 것
        passwordHistories.get(i)를 통해 passwordHistories 리스트에서 i번째 인덱스에 위치한 PasswordHistory 객체를 가져옴
      • if (passwordEncoder.matches(passwordHistory.getUserPassword(), userDetails.getPassword())) throw new IllegalArgumentException("최근 3번 사용한 비밀번호는 사용할 수 없습니다.");
        → passwordHistory.getUserPassword()(암호화) 된 비밀번호가 userDetails.getPassword()(사용자가 입력한 비밀번호)와 같다면 throw
  • 수정 페이지로 넘어가기 전 비밀번호 확인
    public Boolean checkPassword(User user, PasswordRequestDto passwordRequestDto) {
            if (!passwordEncoder.matches(passwordRequestDto.getUserPassword(), user.getUserPassword())) {
                return false;
            }
            return true;
        }
        // 수정 페이지로 넘어가기 전 비밀번호 확인
    • 백엔드만 구현하기 때문에 updateProfile에 넣어주기…

      if (!passwordEncoder.matches(profileUpdateDto.getUserPassword(), userDetails.getPassword())) {
                  throw new IllegalArgumentException("비밀번호 인증에 실패했습니다.");
              }
    • passwordEncoder.matches() 메서드는 첫 번째 인자로 입력된 비밀번호를, 두 번째 인자로는 현재 사용자의 암호화된 비밀번호를 받아 비교

    • 따라서 비교하고자 하는 암호화된 비밀번호는 두 번째 인자로 전달되어야 함

  • 비밀번호 검증을 업데이트 메서드에 합류시켜 줌으로써 컨트롤러 코드도 삭제
    @PostMapping("/check-password")
        public Boolean checkPassword (@AuthenticationPrincipal UserDetailsImpl userDetails, @RequestBody PasswordRequestDto passwordRequestDto) {
            return userService.checkPassword(userDetails.getUser(),passwordRequestDto);
        }
  • PasswordRequestDto도 삭제
    package com.sparta.second.dto;
    
    import lombok.Getter;
    
    @Getter
    public class PasswordRequestDto {
        private String userPassword;
    }
  • @Transactional
    • Transactional이 없다면 영속성 컨텍스트가 종료되고 변경 감지가 되지 않음
    • 변경 감지가 되기 위해서 영속성 컨텍스트가 되어야 하고
    • 조회가 끝나도 업데이트, 딜리트가 이루어질 수 있게!
profile
공부하자개발하자으쌰으쌰

0개의 댓글