@Override @Nullable public Object proceed()throws Throwable { try { returnsuper.proceed(); } catch (RuntimeException ex) { throw ex; } catch (Exception ex) { if (ReflectionUtils.declaresException(getMethod(), ex.getClass()) || KotlinDetector.isKotlinType(getMethod().getDeclaringClass())) { // Propagate original exception if declared on the target method // (with callers expecting it). Always propagate it for Kotlin code // since checked exceptions do not have to be explicitly declared there. throw ex; } else { // Checked exception thrown in the interceptor but not declared on the // target method signature -> apply an UndeclaredThrowableException, // aligned with standard JDK dynamic proxy behavior. thrownewUndeclaredThrowableException(ex); } } }
BUILD SUCCESSFUL in 18s 5 actionable tasks: 5 executed 오후 11:58:36: Task execution finished 'build'.
cli를 들여다보니, 위와 같이 노출이 되는데 자세히 들여다보면 > Task :asciidoctor NO-SOURCE 가 있습니다.
의존성문제인줄알고 버전도 변경 하여 보고 build.gradle 파일의 코드가 잘못되었거나,
버전이 올라가면서 변경점이 있는지 체크해보았으나 다른점이 없어 검색을 하였더니 asciidoctor sourceDirectory가 Maven 플러그인에서는 src/main/asciidoc이지만, Gradle 플러그인은 sourceDirectory가 /src/docs/asciidoc 였습니다. 또한 Spring-REST-Docs에 의해 생성되는 경로도 아래 이미지와 같이 달랐습니다
finalUserpersistUser= userRepository.findUserByIdAndPassword(userId, currentPassword) .orElseThrow(() -> newEntityNotFoundException("회원정보를 찾을 수 없습니다.")); if(!currentPassword.equals(persistUser.getPassword())) { logger.info("changePassword is Not Equal Current Password"); returnnewResponseEntity<>(UserRegisterResult.ERROR.getResponseBody(), HttpStatus.FORBIDDEN); }
new BCryptPasswordEncoder().encode(password);로 암호화 한 패스워드를 저장했기 때문에,
회원을 찾을때도 이렇게 하면 되겠다고 생각해서 위와 같은 코드를 작성하였는데,
테스트중 계속하여 EntityNotFoundException이 발생하였습니다.
디버깅으로 체크하였더니 String currentPassword = new BCryptPasswordEncoder().encode(request.getCurrentPassword()); 부분에서 매번 다른 비밀번호가 currentPassword에 들어갔습니다.
왜 다른 값이 나오는지 알고 싶어 BCryptPasswordEncoder 클래스 파일을 열어보았는데,
encode 부분에서 rawPassword 와 salt값을 생성하여 두개의 값으로 패스워드를 해싱하고 있었습니다.
해당 클래스 파일안에 matches(CharSequence rawPassword, String encodedPassword)라는 함수가 있었고,
클래스의 인터페이스를 확인하였더니,
1 2 3 4 5 6 7 8 9 10 11
/** * Verify the encoded password obtained from storage matches the submitted raw * password after it too is encoded. Returns true if the passwords match, false if * they do not. The stored password itself is never decoded. * * @param rawPassword the raw password to encode and match * @param encodedPassword the encoded password from storage to compare with * @return true if the raw password, after encoding, matches the encoded password from * storage */ boolean matches(CharSequence rawPassword, String encodedPassword);
라는 주석을 확인하였고, 구현체가 아닌 인터페이스를 사용하고자 org.springframework.security.crypto.password.PasswordEncoder 를 의존성 주입하여,
1 2 3 4 5 6 7 8
finalUserpersistUser= userRepository.findById(userId) .orElseThrow(() -> newEntityNotFoundException("회원정보를 찾을 수 없습니다.")); if(!passwordEncoder .matches(request.getCurrentPassword(), persistUser.getPassword())) { logger.info("changePassword is Not Equal Current Password"); returnnewResponseEntity<>(UserRegisterResult.ERROR.getResponseBody(), HttpStatus.FORBIDDEN); }
이와 같이 수정하였고, 기대했던 결과대로 수행되었습니다.
아직 자바와 스프링이 많이 서툴러서 코드를 작성하는 시간보다 검색해보는 시간이 많아 더 어려운거 같습니다.