Wanna be Brilliant Full-Stack Developer
SpringBoot 회원정보수정 security-taglibs 본문
목표
회원정보 변경 설정을 할것이다. 회원가입을 하거나 로그인을 하게되면 그 정보가 회원정보 등록에도 그대로 올라가는것 ( 이름, 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사용하는곳이 많다.
'Back-End > Spring Boot' 카테고리의 다른 글
SpringBoot 회원정보수정 업데이트 완료 (0) | 2022.02.12 |
---|---|
Springboot 회원정보 수정 Ajax 이용하기 (0) | 2022.02.12 |
SpringBoot 로그인 View (0) | 2022.02.11 |
SpringBoot 로그인 2 (0) | 2022.02.11 |
SpringBoot 로그인1 UserDetailsService (0) | 2022.02.10 |