blog - 12

Lumi·2021년 8월 23일
0

project

목록 보기
15/16
post-thumbnail

DB에 있는 회원의 정보를 수정

header.jsp

  • headr에 있는 회원정보를 클릭하면 이동할수 있는 href를 걸어주었다.

  • url 연결은 간단하기 떄문에 따로 적지 않겠다.

updateform.jsp

  • principal은 Security에서 가지고 있는 User의 정보이다.
    == 접속해있는 User의 정보를 그대로 가지고 있는 것이 principal이다.

  • 그러기 때문에 principal에 있는 User를 접근을 할수 있다.
    -> 코드에서도 이런 방식으로 사용하였다.

value="${principal.user.username}"

  • 값을 설정하는 것이다.
  • 이 코드를 추가하면 처음 빈칸에 해당 값이 나오게 된다.

user.js


어려움이 별다르게 없는 코드이다.

ApiController

Service

  • 이 코드 또한 별다른 어려움이 없다.
  • 들어오는 id값을 이용하여 영속성을 시킨뒤 값을 저장하는 코드이다.

-> 여기서 Point!는 새로 인코딩 해야 한다는 점이다.

password는 암호화 과정을 거치기 떄문에 1111로 수정이 되어서 암호화 없이 저장을 한다면 그대로 1111이 DB에 저장이 된다.

  • 이를 방지하기 위해서 수정한 값(1111)을 다시 암호화 한뒤 저장을 한다.

Spring Security의 작동 순서(원리)

  • 요청이 들어오면 어떻게 작동을 하는지 천천히 적어보도록 하겠다.

username, password를 이용하여 로그인 요청이 들어오게 되면 AutheticationFilter에서 값을 가져 가게 된다.

  • 로그인 필터라고 생각하면 된다.
  • 값을 가져가서 UsernamePasswordAutheticationToken을 만들어 준다.

UsernamePasswordAutheticationTokenAuthenticationManager에게 값을 던져주게 되면
해당 username과 password에 대해서 세션을 만들어 주게 된다.

그렇게되면 AuthenticationManager는 username을 UserDetailService에게 보내주다.

그렇게 되면 UserDetailService가 DB를 통해서 해당 username이 있는지 확인을 하고 만약 값이 있다면 AuthenticationManager에게 있다고 알려준다.

그후 AuthenticationManager는 비밀번호를 암호화한뒤 다시 확인하고 이떄 Authentication이라는 객체를 만들어서 시큐리티 컨텍스트에 저장을 한다.

===============================================
정리하자면 값을 받게되면 필터가 가져가고 그후 토큰을 하나 만든다.
그허 매니저에게 던지는데 그 이유는 Authentication객체를 만들기 위함이다.

이것을 만들기 위해서는 실제로 데이터가 있는지 확인을 해야 하기 떄문에 UserDetailService를 통해서 확인을 하고 있으면 들어온 값의 비밀번호를 암호화해서 객체를 만든뒤 시큐리티 컨텍스트에 만든 객체를 저장한다.

세션값 변경하기

  • 위에 코드처럼 회원정보를 수정하게 된다면 Service로직이 모두 실행이 된 시점에서 트랜잭션이 종료된뒤 더티체킹으로 인해 DB의 값이 변경이 되지만
  • 세션(현재 실행중인 시스템)의 값은 변경이 이루어 지지 않는다.

그러기 떄문에 코드를 구성하여 자체적으로 세션을 바꿔주어야 한다.

  • 세션을 바꾸려면 위에 설명한 흐름대로 강제로 만들어 주면 된다.

내가 코드로 구현하고자 하는 그림이다.
새로운 UsernamePasswordAuthenticationToken을 만들어서 이것을 Manager을 통해서 Authentication객체를 강제로 만드는 코드이다.

  • 주석에도 설명이 되었듯이. DB에 값이 저장이 된후에 세션을 유지해야하기 떄문에 Service메서드가 진행이 끝난뒤 코드를 입력해 주었따.

이떄 중요한점이(영상에서도 이걸로 오랜시간이 걸렸는데) user.js를 수정해주어야 한다.

  • 기존의 update(js)는 username의 값을 가져오지 않았는데 새로운 Authentication객체를 만들어야 하기 떄문에 username의 값을 받아서 사용하도록 로직을 변경했다.
profile
[기술 블로그가 아닌 하루하루 기록용 블로그]

0개의 댓글