작성
·
1.2K
2
안녕하세요. 백기선님. 좋은 강의 감사합니다.
강의를 따라가다 Authentication 오류 해결에 어려움을 겪고 있어 질문드립니다.
test소스 authenticated()에서는 Authentication should not be null 에러가 발생하고 뷰단에서도 isAuthenticated() 체크되지 않습니다. 디버깅을 해보면 UsernamePasswordAuthenticationToken 생성 이후 Authentication 객체가 만들어진 것은 확인을 했는데, 어느 시점에서 객체를 못가져오고 null이 찍힙니다.
스프링시큐리티에 대한 지식이 없어 그런지 난감합니다. 도움주시면 감사하겠습니다.
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
0
0
흠.. 테스트 코드면 아마도 테스트용 인증 객체를 가짜로 설정하는 부분이 있을텐데 @WithAccount("keesun") 와 같은 코드가 제대로 동작하는지 디버깅을 해보셔야 할 것 같습니다.
저는 일단...
제대로된 정보는 아니지만
redirect 하면 인증정보를 유지하지 않고 null로 초기화한다네요..?
일단 index로 넘기는 GetMapping 만들어서 리턴시키는걸로 해결은 되었습니다.