본문 바로가기
Spring/JPA + Security

[Spring Security] 스프링 시큐리티의 로그인 세션의 위치, @AuthenticationPrincipal 예제

by pyogowoon 2023. 1. 7.

 

원래 세션은 Authehtication 객체에 최종적으로 저장된다.

만약 내가 username을 찾고싶다면 

원래는  HttpSession 선언하고 SecurityContextHolder 안에 Authentication 객체에서 username을 찾아와야 하는데 이건 너무 복잡한 과정이다. ( 밑에 어노테이션 미사용코드 참고)

 

그래서 탄생한 어노테이션이 

 

@AuthenticationPrincipal
이다.

 

이걸로 Authentication 객체에 바로 접근 가능한데

 

 
 @GetMapping("/user/{id}/update")
    public String update(@PathVariable int id, @AuthenticationPrincipal PrincipalDetails principalDetails){
        //어노테이션
        System.out.println("세션 정보 : " + principalDetails.getUser());

        //어노테이션 미사용시
      Authentication auth =  SecurityContextHolder.getContext().getAuthentication();
      PrincipalDetails mPrin = (PrincipalDetails) auth.getPrincipal();
      System.out.println(mPrin.getUser());
        return "user/update";
    }
}

  어노테이션 사용 코드와 어노테이션 미사용시 코드이다 (아래 코드는 그냥 참고만하세요)

사용하지않은 코드의 코드량 차이가 제법 유의미 하게 난다.

 위 코드처럼 sysout을 찍으면

 

이런식으로 DB에 저장된 데이터의 세션이 주르륵 나온다

그렇다면 이제

 

@GetMapping("user/{id}/update")
public String update(@PathVariable int id , @AuthenticationPrincipal PrincipalDetails principalDetails, Model model){
    model.addAttribute("principal", principalDetails.getUser());


    return "user/update";
}

이렇게 모델에 담아서

 

jsp 에서

 

<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>

이런식으로 EL태그로 활용 가능하다.

댓글