// 1단계: 본인 확인 (이메일 인증)@PostMapping("/password/reset/request")publicStringrequestReset(@RequestParamStringuserid,@RequestParamStringemail){Useruser=userService.findByUserid(userid);// 등록된 이메일과 일치하는지 확인if(!user.getEmail().equals(email)){return"redirect:/password/reset?error=email_mismatch";}// 인증 토큰 생성 및 이메일 전송Stringtoken=generateSecureToken();user.setResetToken(token);userService.save(user);emailService.sendResetEmail(user.getEmail(),token);return"redirect:/password/reset/sent";}// 2단계: 비밀번호 재설정@PostMapping("/password/reset/confirm")publicStringconfirmReset(@RequestParamStringtoken,@RequestParamStringnewPassword){Useruser=userService.findByResetToken(token);if(user==null||!user.isTokenValid()){return"redirect:/password/reset?error=invalid_token";}// 비밀번호 재설정user.setPassword(passwordEncoder.encode(newPassword));user.clearResetToken();userService.save(user);return"redirect:/login?reset=success";}
// 임시 비밀번호를 화면이 아닌 이메일로만 전송@PostMapping("/password/reset")publicStringresetPassword(@RequestParamStringuserid){Useruser=userService.findByUserid(userid);// 안전한 임시 비밀번호 생성StringtempPassword=generateTemporaryPassword();// 비밀번호 업데이트user.setPassword(passwordEncoder.encode(tempPassword));user.setPasswordChanged(false);userService.save(user);// 이메일로만 전송 (화면에 표시하지 않음)emailService.sendTempPassword(user.getEmail(),tempPassword);return"redirect:/login?message=temp_password_sent";}// 첫 로그인 시 비밀번호 변경 강제@GetMapping("/login")publicStringlogin(){if(currentUser!=null&&!currentUser.isPasswordChanged()){return"redirect:/password/change?forced=true";}return"login";}