증상
UserDetailsImpl userDetails = new UserDetailsImpl(user);
Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, "", userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
SecurityContext sc = SecurityContextHolder.getContext();
Security Context 를 저장하였으나 같은 세션임은 확인됨에도 불구하고
SecurityContext.getContext() 또는 @AuthenticationPrincipal 을 사용하는경우 컨텍스트가 유지되지않음
원인
SecurityContextPersistenceFilter 의 지원중단
해결
@Bean
DelegatingSecurityContextRepository delegatingSecurityContextRepository(){
return new DelegatingSecurityContextRepository(new RequestAttributeSecurityContextRepository(),new HttpSessionSecurityContextRepository());
}
Security Config 에 SecurityContextRepository 를 빈등록 후 해당 레포지토리를 호출하여 사용
private final SecurityContextRepository securityContextRepository;
private void saveContext(){
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
Authentication authentication = //필요에 따른 인증객체 생성
SecurityContextHolder.getContext().setAuthentication(authentication);
SecurityContext sc = SecurityContextHolder.getContext();
securityContextRepository.saveContext(sc,request,response);
}
로그인 로직 성공시
해당 메소드에서 인증객체를 생성한뒤 시큐리티 컨텍스트에 넣은뒤, 해당 컨텍스트를 빈등록한 레포지토리에 저장한다
이후 시큐리티컨텍스트의 명시적 저장에 성공했다
'Java' 카테고리의 다른 글
Spring 이미지 내려줄때 캐시설정하기 (0) | 2021.08.20 |
---|---|
Querydsl IDE에서는 실행이 되는데 build가 실패한다면? (1) | 2021.08.19 |
JPA querydsl 사용후 성능개선 (이번엔 진짜로..) (0) | 2021.08.18 |
JPA join fetch 사용후 성능개선(인줄 알았는데 아님) (0) | 2021.08.17 |
Spring Embedded Redis 사용하며 겪은문제 (0) | 2021.08.16 |