들어가기 전에
이제 우리는 회원 가입 후에 로그인을 수행할 수 있게 되었습니다.
로그인 이후에 서버에서 상대방이 로그인을 하였는지는 어떻게 알 수 있을까요?
이번 시간엔 로그인 한 사용자의 정보를 읽어오는 방법에 대해 알아보도록 하겠습니다.
학습 목표
로그인 정보로부터 로그인한 사용자 아이디 정보를 읽어들 일 수 있습니다.
핵심 개념
로그인 한 사용자 정보 읽어 오기
학습하기
들어가기 전에
이제 우리는 회원 가입 후에 로그인을 수행할 수 있게 되었습니다.
로그인 이후에 서버에서 상대방이 로그인을 하였는지는 어떻게 알 수 있을까요?
이번 시간엔 로그인 한 사용자의 정보를 읽어오는 방법에 대해 알아보도록 하겠습니다.
학습 목표
로그인 정보로부터 로그인한 사용자 아이디 정보를 읽어들 일 수 있습니다.
핵심 개념
로그인 한 사용자 정보 읽어 오기
학습하기
이번 시간에는 스프링 시큐리티를 이용해 로그인 한 사용자의 정보를 읽어오는 방법에 대해
학습하겠습니다.
1. 로그인한 사용자의 정보를 보여주는 웹 페이지 작성하기
사용자가 로그인을 한 상태라면, 스프링 MVC는 컨트롤러 메소드에
회원정보를 저장하고 있는 Principal객체를 파라미터로 받을 수 있습니다.
public String memberInfo(Principal principal, ModelMap modelMap) 메소드는 로그인한 회원정보를 받기 위해 Principal을 파라미터로 선언하고 있습니다.
String loginId = principal.getName();
위의 코드를 통해 로그인 아이디를 구할 수 있습니다. 로그인 아이디를 구했다면, 해당 아이디를 이용해 데이터베이스로부터 회원 정보를 읽어 들여 뷰에게 전달 할 수 있을 것입니다.
<MemberController.java>
package org.edwith.webbe.securityexam.controller;
import org.edwith.webbe.securityexam.dto.Member;
import org.edwith.webbe.securityexam.service.MemberService;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import java.security.Principal;
@Controller
@RequestMapping(path = "/members")
public class MemberController {
// 스프링 컨테이너가 생성자를 통해 자동으로 주입한다.
private final MemberService memberService;
private final PasswordEncoder passwordEncoder;
public MemberController(MemberService memberService, PasswordEncoder passwordEncoder){
this.memberService = memberService;
this.passwordEncoder = passwordEncoder;
}
@GetMapping("/loginform")
public String loginform(){
return "members/loginform";
}
@GetMapping("/loginerror")
public String loginerror(@RequestParam("login_error")String loginError){
return "members/loginerror";
}
@GetMapping("/joinform")
public String joinform(){
return "members/joinform";
}
// 사용자가 입력한 name, email, password가 member에 저장된다.
@PostMapping("/join")
public String join(@ModelAttribute Member member){
member.setPassword(passwordEncoder.encode(member.getPassword()));
memberService.addMember(member, false);
return "redirect:/members/welcome";
}
@GetMapping("/welcome")
public String welcome(){
return "members/welcome";
}
@GetMapping("/memberinfo")
public String memberInfo(Principal principal, ModelMap modelMap){
String loginId = principal.getName();
Member member = memberService.getMemberByEmail(loginId);
modelMap.addAttribute("member", member);
return "members/memberinfo";
}
}
회원정보를 보여주는 jsp파일입니다.
<members/memberinfo.jsp>
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html>
<head>
<title>회원 가입폼 </title>
</head>
<body>
<div>
<div>
<h1>회원정보</h1>
<p>로그인한 회원 정보를 표기합니다.</p>
</div>
<div>
<label>id</label>
<p>${member.id}</p>
</div>
<div>
<label>이름</label>
<p>${member.name}</p>
</div>
<div>
<label>암호</label>
<p>${member.password}</p>
</div>
<div>
<label>등록일</label>
<p>${member.createDate}</p>
</div>
<div>
<label>수정일</label>
<p>${member.modifyDate}</p>
</div>
</div>
</body>
</html>
로그인을 한 후 http://localhost:8080/securityexam/members/memberinfo 를 요청하면 아래 형태와 같은 결과가 출력됩니다.
생각해보기
암호는 암호화되어 있더라도 외부에 유출이 되면 안됩니다. 위의 예제에서 암호 부분이 ***** 로 출력되도록 하려면 어떻게 해야 할까요?
comment
1. jsp 에게 모델 객체를 넘겨주기 전에 모델 객체의 password를 인코딩 값 대신 "*****..." 의 문자열로 바꾸어서 전달한다.
2. JavaScript를 활용해서 인코딩 값 대신 "****..."를 출력한다.
혹시 JSP에서 ${member.id }가 그대로 출력되시는 분은
memberinfo파일 상단에
<%@ page isELIgnored="false" %>
를 추가해보세요
패스워드를 입력하는 부분에서 ***로 표시하려면 <input type="password" > 를 사용하면 됩니다. 그러나 비밀번호를 예제처럼 보여주는 페이지는... *** 표시를 논하기 전에 존재해선 안되겠지요.