본문 바로가기
프로젝트/Spring Boot 블로그프로젝트

[블로그프로젝트] 27. 회원정보 수정하기(2)

by dantriss 2023. 6. 15.

유튜브에서 블로그 만들기 프로젝트를 따라하면서 나의 스킬을 조금더 레벨업 하고자 한다.

IDE : IntelliJ

언어 : Java

DB : MySQL

빌드관리 도구 : Maven

OS : iOS

참고유튜브 : 메타코딩


이전 글에서 회원정보를 수정했는데 db에서 값은 변했지만 세션에 저장된 유저의 정보는 변하지 않아서 로그아웃 후 다시 로그인을 하지 않으면 다시 재정보수정하기로 들어가도 기존의 정보가 뜨는 현상이 발생하게된다.

이메일을 1111@test.com으로변경

 

위와같이 1111@test.com으로 변경하였지만 다시 정보수정하기에 들어가도 아래와 같이 변경하기 전 이메일로 나오게된다.

이를해결하기위해서 세션에 저장된 값을 우리가 바꿔주는 작업을 하면된다.

시큐리티 인증절차의 로그인요청과정을 순서대로 나열하자면

 

a. 사용자의 로그인 요청

b. 필터가 로그인을 가로채서 UsernamePasswordAuthenticationToken생성

c. AuthenticationManager에게 넘겨줌

d. AuthenticationManager가 username만 걸러서 userDetailService에게 전달

e. DB에서 해당 username이 있는지 검색

f. 결과값 응답

g. 비밀번호는 BCryptPasswordEncoder를 이용해서 해쉬된 비밀번호까지 체크

h. Authentication 객체를 만들어서 세션에 저장 

 

출처 : getinthere(메타코딩) 블로그

 

 

우선 서비스가 종료되어 트랜잭션이 종료되어 db에 커밋이 되어 변경된 값이 저장된 후에 변경된 유저의 정보를 세션에 넣어줘야하기 때문에 컨트롤러에서 작업을 시작하면 된다.

 

userApiController에 AuthenticationManager를 autowired해준다.

    @Autowired
    private AuthenticationManager authenticationManager;

 

 

그 후 update메서드에 해당 코드를 작성해주면 된다.

 

AuthenticationManager에 usernamePasswordAuthenticationToken에 유저아이디와 비밀번호를 담아서 

SecurityContentHolder에 set해주자

 Authentication authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(user.getUsername()
                , user.getPassword()));
        SecurityContextHolder.getContext().setAuthentication(authentication);

 

여기서 유저의 아이디는 우리가 유저정보를 수정할때 자바스크립트에서 값을 받지 않아서 컨트롤러에 넘어오는 username값이 없기 때문에 user.js에 username값을 받게 추가해주면 된다.

 

update : function(){

            let data = {
                userId : $("#id").val(),
                username : $("#username").val(),
                password : $("#password").val(),
                email : $("#email").val()
            };

            $.ajax({
                type : "PUT",
                url : "/user",
                data : JSON.stringify(data),
                contentType : "application/json; charset=utf-8",
                dataType : "json"

            }).done(function(resp) {
                alert("회원수정완료");

                location.href ="/"
            }).fail(function(error) {
                alert("회원수정실패 다시 한번 확인해주세요")
                alert(JSON.stringify(error));
            });

        }

 

서버를 실행해 테스트를 진행해보자 

이메일을 1111@test.com에서 update@test.com으로 변경해주었다.

 

변경 후 다시 내정보수정하기로 이동해도 비뀐 이메일을 확인할 수 있다.

댓글