[๊ตฌํ] ์คํ๋ง์ผ๋ก ๋น๋ฐ๋ฒํธ ์ฌ์ค์ ๋งํฌ ๋ง๋ค๊ธฐ
๊ณต๋ถํ๋ฉด์ ๋ง๋ค์๊ธฐ ๋๋ฌธ์ ํ๋ฆฐ ๋ถ๋ถ์ด๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์์ ์ ์์ต๋๋ค!
๊ตฌํ ํ ๋ด์ฉ
- ๋น๋ฐ๋ฒํธ๋ฅผ ์ฐพ๊ณ ์ ํ๋ ์ด๋ฉ์ผ์ ์ ๋ ฅ๋ฐ๋๋ค.
- ์ด๋ฉ์ผ๊ณผ ๊ณ ์ ์ฝ๋๋ฅผ ์ ์ฅํ๋ค.
- ๊ณ ์ ์ฝ๋๋ก ๋งํฌ๋ฅผ ๋ง๋ ๋ค.
- ๋ฉ์ผ๋ก ๋งํฌ๋ฅผ ์ ์กํ๋ค.
- ํด๋น ๋งํฌ๋ก ์ ์ํ๋ค(ํ๋ก ํธ์ ์ฐ๊ฒฐํ ๋ ํฉ์๊ฐ ํ์ํ ๊ฒ ๊ฐ์ ์ฝ๊ฐ ๋ฏธ์์ฑ)
- ํด๋น ๊ณ ์ ์ฝ๋์ ๋ง๋ ์ด๋ฉ์ผ์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฌ์ค์ ํ ์ ์๋ค.
- ๋ฐ์ ๋น๋ฐ๋ฒํธ๋ก ํด๋น ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ฐ๊ฟ์ค๋ค.
- ์ฝ๋/์ด๋ฉ์ผ ์ ์ฅํด ๋จ๋ ๊ฒ์ ์ญ์ ํ๋ค;
1. ๋น๋ฐ๋ฒํธ ์ฌ์ค์ ๋งํฌ ์ ์ก ์ปจํธ๋กค๋ฌ
@GetMapping(value = "/user/password/find")
public ResponseEntity<HashMap> findPasswordUrl(@RequestBody VerifyCodeDto codeDto) {
VerifyCode verifyCode = verifyCodeService.saveCode(codeDto);
boolean success = mailService.changePassword(verifyCode);
HashMap<String, Object> responseMap = new HashMap<>();
if (success) {
responseMap.put("status", 200);
responseMap.put("message", "๋ฉ์ผ ๋ฐ์ก ์ฑ๊ณต");
responseMap.put("code", verifyCode.getCode());
return new ResponseEntity<HashMap>(responseMap, HttpStatus.OK);
} else {
responseMap.put("status", 500);
responseMap.put("message", "๋ฉ์ผ ๋ฐ์ก ์คํจ");
return new ResponseEntity<HashMap>(responseMap, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
(์ด๋ฉ์ผ๋ง ๋ค์ด์๋) codeDto๋ฅผ ์ ์ฅํด ๊ณ ์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ ์ฅํ๋ค.
๋ฉ์ผ๋ก ๋ณด๋ธ๋ค.
2. VerifyCodeService/ VerifyCodeRepository
https://dowlsovo.tistory.com/88 ์ด ๊ธ 5,6๋ฒ์ ๋์์๋ค.
[๊ตฌํ] ์ด๋ฉ์ผ ์ธ์ฆ ์ฝ๋ ๋ณด๋ด๊ธฐ
๊ณต๋ถํ๋ฉด์ ๋ง๋ค์๊ธฐ ๋๋ฌธ์ ํ๋ฆฐ ๋ถ๋ถ์ด๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์์ ์ ์์ต๋๋ค! ๊ตฌํ ํ ๋ด์ฉ 1) ๋ฉ์ผ ์ธ์ฆ ์ฝ๋๋ฅผ ๋ง๋ ๋ค. ํด๋น ๋ฉ์ผ๋ก ์ธ์ฆ ์ฝ๋๋ฅผ ๋ณด๋ธ๋ค. 2) ๋ฉ์ผ๋ก ์จ ์ธ์ฆ ์ฝ๋๋ฅผ ์ ๋ ฅํ๋ค.
dowlsovo.tistory.com
3. MailService
/* 2021-11-01 ๊น์์ง*/
@Service
@RequiredArgsConstructor
public class MailService {
private final JavaMailSender javaMailSender;
private final PasswordEncoder passwordEncoder;
...
public boolean changePassword(VerifyCode verifyCode){
if(verifyCode.getCode() == null)
return false;
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setTo(verifyCode.getEmail());
simpleMailMessage.setSubject("Captured-Moment ๋น๋ฐ๋ฒํธ ์ฌ์ค์ ๋งํฌ");
simpleMailMessage.setText("http://localhost:8080/user/password/" + verifyCode.getCode() + "\n"
+ "์ ๋งํฌ์์ ์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ง๋์ธ์");
javaMailSender.send(simpleMailMessage);
return true;
}
}
๋ฐ์ ์ฌ๋, ๋ฉ์ผ ์ ๋ชฉ, ๋งํฌ๋ฅผ ๋ฃ์(๋งํฌ๋ ์์ ํด์ผ ํ๋๋ฐ ์ผ๋จ localhost๋ก ํด๋์ ๊ฒ) ๋ณด๋ผ ๋ด์ฉ์ ์ค์ ํ๊ณ ๋ฉ์ผ์ ๋ณด๋ธ๋ค.
4. ํ ์คํธ
5. ๋น๋ฐ๋ฒํธ ์ฌ์ค์ ํ๋ ์ปจํธ๋กค๋ฌ
@PostMapping(value = "/user/password/{code}")
public ResponseEntity<HashMap> changePassword(@RequestBody UserRequestDto.PasswordDto requestDto, @PathVariable String code){
VerifyCode verifyCode = verifyCodeService.findByCode(code);
HashMap<String, Object> responseMap = new HashMap<>();
if(verifyCode == null){
responseMap.put("status", 401);
responseMap.put("message", "๋ง๋ฃ๋์๊ฑฐ๋ ์๋ชป๋ ๋งํฌ");
return new ResponseEntity<HashMap>(responseMap, HttpStatus.CONFLICT);
}
userService.updatePassword(verifyCode.getEmail(), requestDto);
if(true) {
verifyCodeService.deleteByEmail(verifyCode.getEmail());
responseMap.put("status", 200);
responseMap.put("message", "๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ ์ฑ๊ณต");
return new ResponseEntity<HashMap> (responseMap, HttpStatus.OK);
}
else{
responseMap.put("status", 500);
responseMap.put("message", "๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ ์คํจ");
return new ResponseEntity<HashMap> (responseMap, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
ํด๋น ์ฝ๋๋ฅผ ๊ฐ์ง VerifyCode๋ฅผ ์ฐพ์
๋ฐ์ Password๋ก ๋น๋ฐ๋ฒํธ๋ฅผ ๋ฐ๊ฟ์ค๋ค.
6. UserRequestDto.PasswordDto
password๋ง ๋ฐ์ ์ ์๋ ํด๋์ค๋ฅผ ๋ง๋ค์๋ค.
@Getter
@Setter
public static class PasswordDto{
@ApiParam(value = "ํ์ ํจ์ค์๋", required = true)
@ApiModelProperty(example = "ํจ์ค์๋")
private String pw;
}
7. VerifyCodeService
@Service
@Transactional
@AllArgsConstructor
public class VerifyCodeService {
private final VerifyCodeRepository repository;
....
public VerifyCode findByCode(String code){
VerifyCode verifyCode = repository.findByCode(code);
if(verifyCode != null) repository.deleteByEmail(verifyCode.getEmail());
return verifyCode;
}
}
๊ทธ๋ฅ ๊ฐ๋จํ ์ฝ๋์ ํด๋นํ๋ VerifyCode๋ฅผ ์ฐพ์์ ๋ฆฌํดํ๋ ๋ฉ์๋๋ค.
8. UserSevice
@Transactional
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
private final PasswordEncoder passwordEncoder; // ํจ์ค์๋ ์ธ์ฝ๋
private final ImageUploadService imageUploadService;
...
public String updatePassword(String email, UserRequestDto.PasswordDto requestDto){
User user = userRepository.findByEmail(email).orElseGet(() -> null );
requestDto.setPw(passwordEncoder.encode(requestDto.getPw()));
user.updatePwd(requestDto);
return email;
}
}
email์ ๋ง๋ user ์ ๋ณด๋ฅผ ๊บผ๋ด์์
์ธ์ฝ๋ฉํ ์๋ก์ด ๋น๋ฐ๋ฒํธ๊ฐ ๋ค์ด์๋ PasswordDto๋ก update๋ฅผ ํด์ฃผ๋ ์ฝ๋์ด๋ค.
...
public class User extends Timestamped implements UserDetails {
...
public void updatePwd(UserRequestDto.PasswordDto requestDto){
this.pw = requestDto.getPw();
}
}
์ ๋ฐ์ดํธ ์ฝ๋์ด๋ค.
9. ํ ์คํธ
์ ๋น๋ฐ๋ฒํธ๋ก ๋ก๊ทธ์ธ๋ ์ฑ๊ณต ์ด์ ๋~~!!