스프링 보안의 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
두 가지 방법이있다setContext
및getContext
. 둘 다 aSecurityContextHolderStrategy
를 사용하여 set- 및 get-Context 메서드에서 정확히 수행되는 작업을 지정합니다. -예를 들어ThreadLocalSecurityContextHolderStrategy
는 컨텍스트를 저장하기 위해 로컬 스레드를 사용합니다.
요약하면 사용자 주체 (SecurityContext의 요소)는 HTTP 세션에 저장됩니다. 그리고 각 요청에 대해 액세스하는 로컬 스레드에 배치됩니다.
'Nice programing' 카테고리의 다른 글
Young, Tenured 및 Perm 세대 (0) | 2020.12.04 |
---|---|
JSP 페이지 세션 = "false"지시문을 설정하는 이유는 무엇입니까? (0) | 2020.12.04 |
java.sql에 해당하는 datetime? (0) | 2020.12.04 |
MSVCP140.dll 누락 (0) | 2020.12.03 |
Subversion 및 Visual Studio 프로젝트에 대한 모범 사례 (0) | 2020.12.03 |