Wanna be Brilliant Full-Stack Developer

SpringBoot 회원정보수정 security-taglibs 본문

Back-End/Spring Boot

SpringBoot 회원정보수정 security-taglibs

Flashpacker 2022. 2. 12. 01:29


목표 

회원정보 변경 설정을 할것이다. 회원가입을 하거나 로그인을 하게되면 그 정보가 회원정보 등록에도 그대로 올라가는것 ( 이름, username, 패스워드 ) 

이런 값들을 나오기 위해서는 세션정보를 바로 나오면된다! 그러면 끝!!

 

update.jsp만 수정하면되는데! 세션 정보는 어디서 얻느냐? Usercontroller에서 principalDetails가 가지고 있다. 저페이지로 넘어가기 위해 모델에 담아서 들고 넘어가야하는데. 

package com.cos.photogramstart.web;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

import com.cos.photogramstart.config.auth.PrincipalDetails;

@Controller
public class UserController {
	
	@GetMapping("/user/{id}")
	public String profile(@PathVariable int id) {
		return "user/profile";
	}
	
	@GetMapping("/user/{id}/update")	//user에 업데이트가 아니라 어떤 번호를 업데이트 할건지 해야하기때문 {id}를 건다!
	public String update(@PathVariable int id,@AuthenticationPrincipal PrincipalDetails principalDetails , Model model) {
		// 1. 추천
		System.out.println("세션 정보:" + principalDetails.getUser());
		
		// 2.비추천
		Authentication auth = SecurityContextHolder.getContext().getAuthentication();
		PrincipalDetails mPrincipalDetails = (PrincipalDetails) auth.getPrincipal();
		System.out.println("직접 찾은 세션 정보 : " + mPrincipalDetails.getUser());
		
		model.addAttribute("principal", principalDetails.getUser());		
		return "user/update";
	}
}

update.jsp에서 어떻게 받아내냐면 username 쪽에는 ${principal.username} 

//principal이라는 단어사용하는 이유는 접근 주체, 인증 주체라는 거에서  인증되는 사용자의 오브젝트 로 쓰이기 변수로 쓰이기에 좋다

principal 유저 오브젝트이니까 getusername 호출하면되는데 username만 해도 get하고 호출된다.

나머지 정보를 가져와야할것들도 다같이 이렇게 수정및 추가하면된다!

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%@ include file="../layout/header.jsp"%>

<!--프로필셋팅 메인-->
<main class="main">
	<!--프로필셋팅 섹션-->
	<section class="setting-container">
		<!--프로필셋팅 아티클-->
		<article class="setting__content">

			<!--프로필셋팅 아이디영역-->
			<div class="content-item__01">
				<div class="item__img">
					<img src="#" onerror="this.src='/images/person.jpeg'" />
				</div>
				<div class="item__username">
					<h2>${principal.username}</h2>
				</div>
			</div>
			<!--프로필셋팅 아이디영역end-->

			<!--프로필 수정-->
			<form id="profileUpdate"">
				<div class="content-item__02">
					<div class="item__title">이름</div>
					<div class="item__input">
						<input type="text" name="name" placeholder="이름"
							value="${principal.name }" />
					</div>
				</div>
				<div class="content-item__03">
					<div class="item__title">유저네임</div>
					<div class="item__input">
						<input type="text" name="username" placeholder="유저네임"
							value="${principal.username }" readonly="readonly" />
					</div>
				</div>
				<div class="content-item__04">
					<div class="item__title">패스워드</div>
					<div class="item__input">
						<input type="password" name="password" placeholder="패스워드"  />
					</div>
				</div>
				<div class="content-item__05">
					<div class="item__title">웹사이트</div>
					<div class="item__input">
						<input type="text" name="website" placeholder="웹 사이트"
							value=" ${principal.website }"/>
					</div>
				</div>
				<div class="content-item__06">
					<div class="item__title">소개</div>
					<div class="item__input">
						<textarea name="bio" id="" rows="3">${principal.bio }</textarea>
					</div>
				</div>
				<div class="content-item__07">
					<div class="item__title"></div>
					<div class="item__input">
						<span><b>개인정보</b></span> <span>비즈니스나 반려동물 등에 사용된 계정인 경우에도
							회원님의 개인 정보를 입력하세요. 공개 프로필에는 포함되지 않습니다.</span>
					</div>
				</div>
				<div class="content-item__08">
					<div class="item__title">이메일</div>
					<div class="item__input">
						<input type="text" name="email" placeholder="이메일"
							value="${principal.email }" readonly="readonly" />
					</div>
				</div>
				<div class="content-item__09">
					<div class="item__title">전회번호</div>
					<div class="item__input">
						<input type="text" name="tel" placeholder="전화번호"
							value="${principal.phone }" />
					</div>
				</div>
				<div class="content-item__10">
					<div class="item__title">성별</div>
					<div class="item__input">
						<input type="text" name="gender" value="${principal.gender }" />
					</div>
				</div>

				<!--제출버튼-->
				<div class="content-item__11">
					<div class="item__title"></div>
					<div class="item__input">
						<button>제출</button>
					</div>
				</div>
				<!--제출버튼end-->

			</form>
			<!--프로필수정 form end-->
		</article>
	</section>
</main>

<script src="/js/update.js"></script>

<%@ include file="../layout/footer.jsp"%>

이렇게 안넘기고 쉽게 넘기는 방법이 있는데 

pom.xml에

<!-- 시큐리티 태그 라이브러리 -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
</dependency>

라는 것이 있다. 이거를 어떻게 활용하면 되냐면 header.jsp는 모든 파일에 인클루드가 되어있다. 

우리가 헤더에만 정의를 하면 된다! 

 

<sec:authorize access="isAuthenticated()"> <!-- 인증된 정보에 접근 하는 방법 , 세션에 접근하는 방법 -->
<sec:authentication property="principal" var="principal"/> <!-- principal은 세션정보에 접근이된다. 키워드  -->
</sec:authorize>

이렇게 적으면 ${principal.user}  유저에 접근이 된다. 

 

update.jsp에서 

${principal.name }에서 더추가를 해야하는데 ${principal.user.name }

principal은 principalDetails까지니까 .user하면  getuser호출하겠다 그 안에 있는 username을 찾아야한다. 

 

pring-security-taglibs이게 굉장히 좋기떄문에 jsp할떄는 사용하면된다. 

회사가면 아직 jsp사용하는곳이 많다.