[SPRING] 쓰레드에서 봄 보안 현재 사용자
SPRING쓰레드에서 봄 보안 현재 사용자
안녕 스레드 범위에서 봄 보안을 사용하면 몇 가지 문제가 생겼다.
System.out.println(((User) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId());
new Thread(() -> System.out.println(((User) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId())).start();
이 두 줄은 현재 사용자 ID를 제공해야합니다.
첫 번째 라인은 예상대로 작동한다.
두 번째 줄은 NullPointerException을 제공합니다. 현재 사용자가 없으므로 null 값입니다.
내가 노래 테이블에 많은 행을 저장하고 그것 hava @ CreateBy 사용자 가이 스레드에서 현재 사용자를 요구하고 현재 사용자에 대한 null 값을 줄 것이다 실패 로이 문제를 발견
해결법
-
==============================
1.한 스레드에서 다른 스레드로 SecurityContext를 전송할 수 있습니다.
한 스레드에서 다른 스레드로 SecurityContext를 전송할 수 있습니다.
Runnable originalRunnable = new Runnable() { public void run() { // invoke secured service } }; SecurityContext context = SecurityContextHolder.getContext(); DelegatingSecurityContextRunnable wrappedRunnable = new DelegatingSecurityContextRunnable(originalRunnable, context); new Thread(wrappedRunnable).start();
동시성 지원을 참조하십시오.
http://docs.spring.io/spring-security/site/docs/current/reference/html/concurrency.html
-
==============================
2.스폰 된 스레드가 상위 스레드의 SecurityContext를 상속하도록하려면 MODE_INHERITABLETHREADLOCAL 전략을 설정해야합니다.
스폰 된 스레드가 상위 스레드의 SecurityContext를 상속하도록하려면 MODE_INHERITABLETHREADLOCAL 전략을 설정해야합니다.
SecurityContextHolder API를 참조하십시오.
이것도 참조하십시오.
-
==============================
3.모든 하위 스레드가 ThreadLocal에서 SecurityContextHolder를 상속 받기를 원할 경우 @PostConstruct로 주석 된 메소드를 사용하여 전역 적으로 설정할 수 있습니다. 이제 자식 스레드는 동일한 SecurityContextHolder에 액세스 할 수 있습니다.
모든 하위 스레드가 ThreadLocal에서 SecurityContextHolder를 상속 받기를 원할 경우 @PostConstruct로 주석 된 메소드를 사용하여 전역 적으로 설정할 수 있습니다. 이제 자식 스레드는 동일한 SecurityContextHolder에 액세스 할 수 있습니다.
@PostConstruct void setGlobalSecurityContext() { SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL); }
건배
from https://stackoverflow.com/questions/42341635/spring-security-current-user-in-thread by cc-by-sa and MIT license