-
Spring Async에서 SecurityContextHolder 접근하기글또 2023. 11. 4. 19:58
0. 들어가며..
안녕하세요.
이번에는 좀 간단한 글을 써보려고 합니다.
요구사항은 kafka event header에 요청자의 이름을 넣어달라는 것이었습니다.
고민해 봤을 때 요청자의 이름은 spring security를 사용 중이니 securityContextHolder에서 가져올 생각이었습니다.
하지만 현재 kafka template을 비동기(@Async)로 사용 중이었기 때문에 threadLocal안에 있는 securityContextHolder는 가져올 수 없을 것이라고 생각했습니다.
그러다 DelegatingSecurityContextAsyncTaskExecutor라는 것을 알게 되었습니다.
DelegatingSecurityContextAsyncTaskExecutor (spring-security-docs 6.1.5 API)
Methods inherited from interface org.springframework.core.task.AsyncTaskExecutor submitCompletable, submitCompletable Methods inherited from interface org.springframework.core.task.TaskExecutor execute
docs.spring.io
1. Config
준비해야 하는 것은 스레드 풀과 해당 스레드풀의 delegete입니다.
2. kafka interceptor에서 SecurityContextHolder 접근
KafkaRecordInterceptor.kt 이제 다른 스레드에서 작동하는 kafka template에서도 호출 스레드에서 가져온 SecurityContextHolder 정보를 가져올 수 있습니다.
3. 내부 구현
내부적으로는 Executor를 상속받은 DelegatingSecurityContextExecutor가 execute 될 때 wrap(AbstractDelegatingSecurityContextSupport.kt)을 호출해서 DelegatingSecurityContextRunnable를 반환한다.
AbstractDelegatingSecurityContextSupport는 DelegatingSecurityContextAsyncTaskExecutor의 최상위 클래스입니다.
DelegatingSecurityContextExecutor.java DelegatingSecurityContextRunnable.java 정의한 DelegatingSecurityContextAsyncTaskExecutor가 DelegatingSecurityContextRunnable에 의해서 실행되는데
securityContextHolder을 넣어주고 finally에서 초기화해 주는 작업을 해줍니다.
샘플코드
GitHub - ChoiGiSung/spring-security-propagation: spring-security-propagation
spring-security-propagation. Contribute to ChoiGiSung/spring-security-propagation development by creating an account on GitHub.
github.com
'글또' 카테고리의 다른 글
spring cache 커스텀으로 성능개선하기 (0) 2024.01.21 테크니컬 라이팅 강의를 듣고나서 (0) 2024.01.06 spring security white list 어노테이션 만들기 (0) 2023.11.01 Spring kafka에서 Multi Type Converter 여행기 (0) 2023.09.25 인프콘 2023 (0) 2023.08.22