복붙노트

[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. ==============================

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

    2.스폰 된 스레드가 상위 스레드의 SecurityContext를 상속하도록하려면 MODE_INHERITABLETHREADLOCAL 전략을 설정해야합니다.

    스폰 된 스레드가 상위 스레드의 SecurityContext를 상속하도록하려면 MODE_INHERITABLETHREADLOCAL 전략을 설정해야합니다.

    SecurityContextHolder API를 참조하십시오.

    이것도 참조하십시오.

  3. ==============================

    3.모든 하위 스레드가 ThreadLocal에서 SecurityContextHolder를 상속 받기를 원할 경우 @PostConstruct로 주석 된 메소드를 사용하여 전역 적으로 설정할 수 있습니다. 이제 자식 스레드는 동일한 SecurityContextHolder에 액세스 할 수 있습니다.

    모든 하위 스레드가 ThreadLocal에서 SecurityContextHolder를 상속 받기를 원할 경우 @PostConstruct로 주석 된 메소드를 사용하여 전역 적으로 설정할 수 있습니다. 이제 자식 스레드는 동일한 SecurityContextHolder에 액세스 할 수 있습니다.

    @PostConstruct
    void setGlobalSecurityContext() {
      SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
    }
    

    건배

  4. from https://stackoverflow.com/questions/42341635/spring-security-current-user-in-thread by cc-by-sa and MIT license