일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- springboot
- 백준
- BFS
- UML
- 포트앤어댑터 아키텍처
- 데이터 flow
- series
- spring security
- 세그먼트 트리
- 위상정렬
- pandas
- 파이썬
- JPA
- Redis
- dfs
- 헥사고날 아키텍처
- equals
- 문자열
- 스프링
- 자바
- 비트마스크
- 알고리즘
- java
- ddd
- dataframe
- 이펙티브 자바
- DP
- docker
- disjoint set
- 다익스트라
- Today
- Total
코딩못하는사람
@AuthenticationPrincipal 어노테이션 본문
스프링 시큐리티를 활용하여 인증,인가를 처리할 때 @AuthenticationPrincipal를 쓰면 쉽게 UserDetails를 구현하여 만든 Principal 인스턴스를 얻을 수 있었다. 쉽게 사용했지만 어떻게 동작하는지 궁금해져 찾아 보았다.
Spring Security에서 AuthenticationFilter를 거쳐 인증을 완료하게 되면 Authentication 인터페이스를 구현한 UsernamePasswordAuthenticationToken을 SecurityContextHolder에 설정하게 된다.
@AuthenticationPrincipal는 스프링 시큐리티의 AuthenticationPrincipalArgumentResolver 클래스를 활용하여 SecurityContextHolder에 접근해서 값을 돌려준다.
1. 인증을 하여 SecurityContextHolder에 들어가있는 Authentication 인스턴스를 가져온다.
2.각자 구현했을 principal객체가 다르기 때문에 authentication.getPrincipal()를 사용하여 Object타입으로 받아준다.
그 후 AuthenticationPrincipal 어노테이션에 사용한 parameter를 얻어내 exprsssion 메서드를 통해 String으로 사용자가 인증에 사용하는 클래스의 이름을 알아낸다(ex PrincipalDetails).
3. 알아낸 클래스 이름과 스프링 컨테이너에서 Bean을 찾아주는 beanResolver, context에 설정한 값을 가지고 인증시에 사용했던 클래스의 인스턴스를 만들어낸다.
배운점
- SpringSecurity 동작과정과 사용되는 객체들을 디버깅해보면서 좀 더 친해졌다.
- SecurityContextHolder.getContext().getAuthentication().getPrincipal()라고 간단히 생각하자.
'스프링(Spring) > 개념' 카테고리의 다른 글
@Transactional의 동작방식(AOP,PSA) (0) | 2022.01.03 |
---|---|
Filter와 Interceptor (0) | 2021.12.30 |
스프링과 스프링부트 (0) | 2021.09.17 |
스프링이 무엇이고 왜 나왔을까? (1) | 2021.09.17 |
객체지향 설계 5원칙-SOLID (0) | 2021.09.17 |