인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

henry_hong님의 프로필 이미지
henry_hong

작성한 질문수

스프링 시큐리티

5) 인증 및 인가 예외 처리 - AjaxLoginUrlAuthenticationEntryPoint, AjaxAccessDeniedHandler

AjaxAuthenticationSuccessHandler 관련 질문

작성

·

303

0

안녕하세요 강사님!
실습을 진행하다가 오류가 생기는 부분이있어서 질문드립니다.

AjaxAuthenticationSuccessHandler 부분에서

@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
throws IOException, ServletException {
Account account = (Account) authentication.getPrincipal();

response.setStatus(HttpStatus.OK.value());
response.setContentType(MediaType.APPLICATION_JSON_VALUE);

objectMapper.writeValue(response.getWriter(),account);
}

Rest방식으로 user를 호출했을 때, 302에러와 함께

Account account = (Account) ... 부분에서 타입캐스팅 관련 오류가 뜹니다. 그래서 Account 가 아닌 기존의 Object 형으로 받아서 진행하면 오류없이 잘 진행이됩니다. authentication.getPrinciple() 이 String을 반환하는 코드는 아무리 찾아봐도 없는데 String cannot be cast to... 오류가 뜨는것이 이해가 가지 않아 질문드립니다.

답변 1

1

정수원님의 프로필 이미지
정수원
지식공유자

일단 authentication.getPrinciple() 에서 어떤 값이 나오는지 확인해 보시기 바랍니다

그리고 인증에 성공한 이후에 principal 속성에 어떤 값을 저장했는지도 확인해 보시기 바랍니다

일반적으로 인증에 성공한 이후에는 UserDetails 타입의 유저객체를 생성해서 Authentication 객체의 Principal 속성에 저장하게 됩니다. 

Principal 속성의 타입은 Object 이기 때문에 어떤 타입도 저장이 가능하지만 인증 이후에는 String 타입의 값을 저장하지는 않습니다.

인증을 시도하는 경우 사용자가 입력한 String 타입의 username 을 Authenticationl 의 Principal 속성에 저장하지만 질문하신 내용은 인증을 처리한 이후 시점이기 때문에 String 타입의 값을 저장하지는 않을 것으로 보여집니다.

확인 해 보시면 될 것 같습니다.

henry_hong님의 프로필 이미지
henry_hong

작성한 질문수

질문하기