Nice programing

스프링 보안의 SecurityContextHolder : 세션 또는 요청 바인딩?

nicepro 2020. 12. 4. 20:34
반응형

스프링 보안의 SecurityContextHolder : 세션 또는 요청 바인딩?


내가 검색 한 Userprincipal SecurityContextHolder이 요청 또는 세션에 바인딩됩니까?

UserPrincipal principal = (UserPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

이것이 현재 로그인 한 사용자에게 액세스하는 방법입니다. 현재 세션이 파괴되면 무효화됩니까?


구성 방법에 따라 다릅니다 (또는 다른 동작을 구성 할 수 있다고 가정 해 보겠습니다).

웹 응용 프로그램에서 당신은 사용 ThreadLocalSecurityContextHolderStrategy과 어떤 상호 작용을 SecurityContextPersistenceFilter.

Java Doc은 다음으로 SecurityContextPersistenceFilter시작합니다.

요청 전에 구성된 {@link SecurityContextRepository}에서 얻은 정보로 {@link SecurityContextHolder}를 채우고 요청이 완료되고 컨텍스트 홀더를 지우면 저장소에 다시 저장합니다. 기본적으로 {@link HttpSessionSecurityContextRepository}를 사용합니다. HttpSession 관련 구성 옵션에 대한 정보는이 클래스를 참조하십시오.

Btw : HttpSessionSecurityContextRepository는 SecurityContextRepository의 유일한 구현입니다 (기본 라이브러리에서 찾았습니다).

다음과 같이 작동합니다.

  • HttpSessionSecurityContextRepository사용은 HttpSession에 (키 = "SPRING_SECURITY_CONTEXT은")를 저장하는 SecurityContext객체.
  • SecurityContextPersistenceFilter가 사용하는 필터이며 SecurityContextRepository, 예를 들면은 HttpSessionSecurityContextRepository로드 및 저장하는 SecurityContext개체. HttpRequest가 필터를 통과하면 필터 SecurityContext는 저장소에서 가져와 SecurityContextHolder ( SecurityContextHolder#setContext) 에 넣습니다.
  • SecurityContextHolder두 가지 방법이있다 setContextgetContext. 둘 다 a SecurityContextHolderStrategy를 사용하여 set- 및 get-Context 메서드에서 정확히 수행되는 작업을 지정합니다. -예를 들어 ThreadLocalSecurityContextHolderStrategy는 컨텍스트를 저장하기 위해 로컬 스레드를 사용합니다.

요약하면 사용자 주체 (SecurityContext의 요소)는 HTTP 세션에 저장됩니다. 그리고 각 요청에 대해 액세스하는 로컬 스레드에 배치됩니다.

참고 URL : https://stackoverflow.com/questions/6408007/spring-securitys-securitycontextholder-session-or-request-bound

반응형