본문 바로가기

JAVA/JAVA-Project

[스프링] 정보 수정 시 비밀번호 재확인, RedirectAttributes를 alert()으로 띄우기. 21. 05. 13.

개요

로그인한 이용자가 자신의 정보를 수정하려고 마이페이지로 이동하면 비밀번호를 재확인하도록 했다.
스프링 시큐리티를 이용했는데 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()으로 띄우는 거지?'싶어서 구글링을 해 봤더니 생각보다 되게 간단했다. 너무 간단해서 이렇게 하는 게 정석에 가까운 코드가 맞나 싶었다.

 

원하던 대로 완성!