개요
로그인한 이용자가 자신의 정보를 수정하려고 마이페이지로 이동하면 비밀번호를 재확인하도록 했다.
스프링 시큐리티를 이용했는데 Authentication 객체를 이용하면 로그인한 사용자 정보를 알 수 있다. 이걸 이용해서 컨트롤러에서 처리해보았다.
MemberController.java
@Controller
@Log4j
@RequestMapping("/member/*")
public class MemberController {
@Autowired
private MemberService service;
@Autowired @Qualifier("BCryptPasswordEncoder")
private PasswordEncoder encoder;
/* 생략 */
@GetMapping("prevModify")
public void getPrevModify(Authentication auth) {
}
@PostMapping("prevModify")
public String postPrevModify(Authentication auth, @RequestParam("userpw") String pw, RedirectAttributes rttr) {
CustomUser user = (CustomUser) auth.getPrincipal();
String userpw = user.getVo().getUserpw();
if(encoder.matches(pw, userpw)) {
log.info("pw 재확인 완료..");
return "redirect:/member/modify";
}
else {
rttr.addFlashAttribute("msg", "비밀번호를 다시 확인해 주세요.");
return "redirect:/member/prevModify";
}
}
/* 생략 */
}
🔶 BCryptPasswordEncoder로 암호화된 비밀번호를 저가 폼에 입력한 입력값과 어떻게 비교해야 하는지가 고민이었고, 구글링으로 내가 찾아낸 방법은 PasswordEncoder에 있는 matches()
라는 메서드를 이용하는 방법이었다.
🔶 비밀번호가 일치하지 않으면 재입력을 받도록 redirect만 했었는데, alert()으로 재입력하라는 문구가 있어야 한다고 생각해서 RedirectAttributes를 이용해 보았다.
RedirectAttributes 객체의 addFlashAttributes()는 리다이렉트 시점에 한 번만 사용되는 데이터를 전송한다.
또한 addFlashAttribute()는 브라우저까지 전송되지만 URI 상에는 보이지 않는 숨겨진 데이터의 형태로 전달된다.
prevModify.jsp
<script>
var msg = '${msg}';
if(msg === '비밀번호를 다시 확인해 주세요.') {
alert("비밀번호를 다시 확인해 주세요.");
}
</script>
🔶 '그래서 컨트롤러의 메시지를 어떻게 alert()으로 띄우는 거지?'싶어서 구글링을 해 봤더니 생각보다 되게 간단했다. 너무 간단해서 이렇게 하는 게 정석에 가까운 코드가 맞나 싶었다.
원하던 대로 완성!
'JAVA > JAVA-Project' 카테고리의 다른 글
[스프링] 좌석 만료일이 지났을 때 처리 21. 05. 24. (0) | 2021.05.24 |
---|---|
[스프링] 게시판 글쓴이 출력 시 일부 * 처리 21. 05. 14. (0) | 2021.05.13 |
[스프링] 게시판 비밀글 설정 구현 21. 05. 05. (0) | 2021.05.05 |
화면구현에 서블릿 적용 - 카테고리 21. 03. 24. (0) | 2021.03.24 |
미니 팀프로젝트 진행상황(21. 02. 10. ~ ) (0) | 2021.02.14 |