인프런 커뮤니티 질문&답변

Heeah님의 프로필 이미지

작성한 질문수

스프링과 JPA 기반 웹 애플리케이션 개발

현재 인증된 사용자 정보 참조

Authentication should not be null 오류 질문

작성

·

1.2K

2

안녕하세요. 백기선님. 좋은 강의 감사합니다.
강의를 따라가다 Authentication 오류 해결에 어려움을 겪고 있어 질문드립니다.
test소스 authenticated()에서는 Authentication should not be null 에러가 발생하고 뷰단에서도 isAuthenticated() 체크되지 않습니다. 디버깅을 해보면 UsernamePasswordAuthenticationToken 생성 이후 Authentication 객체가 만들어진 것은 확인을 했는데, 어느 시점에서 객체를 못가져오고 null이 찍힙니다.

Screenshot 2023-04-18 at 5.41.19 PM.jpegScreenshot 2023-04-18 at 5.01.08 PM.jpeg

스프링시큐리티에 대한 지식이 없어 그런지 난감합니다. 도움주시면 감사하겠습니다.
Spring-Security6 사용중입니다.

답변 4

2

Security6 를 사용하는 경우 아래와 같이 하시면 동작합니다

// Service class
private final SecurityContextHolderStrategy securityContextHolderStrategy;
private final SecurityContextRepository securityContextRepository;

public void login(Account account, HttpServletRequest request, HttpServletResponse response) {
   account.login(clockHolder);
   UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
      account.getNickname(),
      account.getPassword(),
      Collections.singleton(new SimpleGrantedAuthority("ROLE_USER")));
   SecurityContext context = securityContextHolderStrategy.createEmptyContext();
   context.setAuthentication(token);
   securityContextHolderStrategy.setContext(context);
   securityContextRepository.saveContext(context, request, response);
}

// Security Config class
@Bean
public SecurityContextHolderStrategy securityContextHolderStrategy() {
  return SecurityContextHolder.getContextHolderStrategy();
}

@Bean
public SecurityContextRepository securityContextRepository() {
  return new HttpSessionSecurityContextRepository();
}

시큐리티6 부터 모든 요청에 대해 세션을 사용하지 않아, 사용자 정보를 저장할 수 없는 것 같습니다.
아래 문서에서 수동으로 사용자 정보를 저장하는 방법이 있어 참고했습니다.

 

참고 : https://docs.spring.io/spring-security/reference/servlet/authentication/session-management.html

 

 

0

해결 하셨나요... 아직도 해결못하고있네요

html에서 sec 관련 사용이 안되네요..

디버깅하면 리다이렉트 전까지 SecurityContext에 담겨있는데 말이죠..

저는 일단...
제대로된 정보는 아니지만
redirect 하면 인증정보를 유지하지 않고 null로 초기화한다네요..?

일단 index로 넘기는 GetMapping 만들어서 리턴시키는걸로 해결은 되었습니다.

0

저도 현재 이 문제 떄문에 스트레스받으며 구글링중이랍니다 ㅋㅋㅋㅋㅋ 백선생님의 현명한답변을 기다리고있지만 조용하시네용 ㅠ

0

백기선님의 프로필 이미지
백기선
지식공유자

흠.. 테스트 코드면 아마도 테스트용 인증 객체를 가짜로 설정하는 부분이 있을텐데 @WithAccount("keesun") 와 같은 코드가 제대로 동작하는지 디버깅을 해보셔야 할 것 같습니다.

Heeah님의 프로필 이미지

작성한 질문수

질문하기