들어가기 전에
이제 우리는 회원 가입 후에 로그인을 수행할 수 있게 되었습니다.
로그인 이후에 서버에서 상대방이 로그인을 하였는지는 어떻게 알 수 있을까요?
이번 시간엔 로그인 한 사용자의 정보를 읽어오는 방법에 대해 알아보도록 하겠습니다.
학습 목표
로그인 정보로부터 로그인한 사용자 아이디 정보를 읽어들 일 수 있습니다..
핵심 개념
로그인 한 사용자 정보 읽어 오기
학습하기
이번 시간에는 스프링 시큐리티를 이용해 로그인 한 사용자의 정보를 읽어오는 방법에 대해
학습하겠습니다.
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>
로그인을 한 후 http://localhost:8080/securityexam/members/memberinfo 를 요청하면 아래 형태와 같은 결과가 출력됩니다.
생각해보기
암호는 암호화되어 있더라도 외부에 유출이 되면 안됩니다. 위의 예제에서 암호 부분이 ***** 로 출력되도록 하려면 어떻게 해야 할까요?
comment
이전 강의보다 간단한 파트이긴한데 그래도 업데이트 부탁드려요~
강의 자료가 잘못되어서 이 실습을 따라하지 못하시는 분은 제 저장소 프로젝트를 참고하세요
https://github.com/imbf/boostcourse-web-backend/tree/master/web-app-reservation-service-3/securityexam
강의자료가 잘못되어있습니다.
강의 자료가 잘못된것 같습니다.
뭐 근데 회원가입이라해도 form태그에서 입력받은 값을 서버로 보낸뒤 데이터베이스에 그대로 삽입하면 되는부분이라 크게 어렵지는 않을듯합니다만 그래도 강의페이지를 수정해주세요!
강의 내용이 잘못 올라왔습니다. 회원 가입하기 내용이 올라와야 하는데 6) 로그인한 사용자 정보 조회하기 내용이 그대로 복사되어 있네요.