본문 바로가기

Java

Spring Security 6 Security Context null 문제

 

증상

 

        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);
    }

 

로그인 로직 성공시

해당 메소드에서 인증객체를 생성한뒤 시큐리티 컨텍스트에 넣은뒤, 해당 컨텍스트를 빈등록한 레포지토리에 저장한다

 

 

 

이후 시큐리티컨텍스트의 명시적 저장에 성공했다