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

권정현님의 프로필 이미지
권정현

작성한 질문수

스프링 시큐리티

로그인후 컨트롤러에서 세션을 이용하는 것에 대해 문의 드립니다.

작성

·

446

0

혼자 시큐리티를 이용한 포트폴리오를 만들면서 세션문제를 만나

다른분께서 올리신 세션에 대한 질문을 보고 질문드리게 되었습니다

https://www.inflearn.com/questions/37286

여기에서 

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

Object principal = authentication.getPrincipal();

String username = null;

if(principal != null && principal instanceof User){

    username = ((User) principal).getUsername();

}

라고 답변해 주셨는데  섹션3-Form인증 구현에서 User를 상속 받은 AccountContext를 만든것을  따라 적용했습니다.

그리고 AuthenticationProvider 클래스 안에서 강의처럼 모두 작성하였고 마지막으로

UsernamePasswordAuthenticationToken authToken = 

 new UsernamePasswordAuthenticationToken(

accountContext.getAccount(), null, accountContext.getAuthorities());

를 만들어 리턴시켜 주었습니다. 그리고 저기 답변주신 코드처럼 if문 안에서 principal의 null 체크와 User를 상속받은

principal인지 확인하는 것인데 로그인 후 Object principal은 Account 객체이고 User를 상속받은 것은 AccountContext라

if문안에 들어가지 않습니다. 이때 UsernamePasswordAuthenticationToken을 수정해야 되는지 모르겠어서 문의 드리게 되

었습니다. 

그리고 로그인 하지 않은 유저는 Object principal에 ANONYMOUS가 들어가있고 로그인한 유저는 Account 객체가

들어가서 두 상황 모두 if 문 안에 principal !=null 통과하는 것을 확인 했습니다. 어떠한 상황을 위해 null 여부를 판별하는지 궁금합니다. 

답변 3

1

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

네 열강하신만큼 좋은 결과가 있을거라 믿어 의심치 않습니다

화이팅 하십시오^^

1

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

위의 예시 구문은 강의소스와는 별개로 설명드린 것입니다.

강의 소스 기준으로 설명을 드리자면 

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

Object principal = authentication.getPrincipal();

String username = null;

if(principal != null && principal instanceof Account){

    username = ((Account) principal).getUsername();

}

가 될 것입니다.

그리고 principal != null 인 상황은 익명사용자와 인증사용자를 구분하기 위한 용도는 아닙니다

로그인 시 저장한 사용자객체가 맞는지를 체크하기 위해서  principal != null &&  principal instanceof Account 와 같은 로직을 작성한 것입니다.

또한 

UsernamePasswordAuthenticationToken authToken =  new UsernamePasswordAuthenticationToken(

accountContext.getAccount(), null, accountContext.getAuthorities());

위 구문도

UsernamePasswordAuthenticationToken authToken =  new UsernamePasswordAuthenticationToken(

accountContext, null, accountContext.getAuthorities());

하고서 

if(principal != null && principal instanceof AccountContext){

    username = ((AccountContext) principal).getAccount().getUsername();

}

이렇게 해도 무방합니다.

결국은 인증에 성공한 이후에 인증필터에 의해 SecurityContext 안에 저장된 Authentication 객체와 Authentication 안에 AccountContext, Account 객체들을 어떤식으로 구성해서 저장할 것인지를 정책에 따라 결정해서 구현하시면 됩니다.

0

권정현님의 프로필 이미지
권정현
질문자

확실하게 이해했습니다. 감사합니다^^

처음에는 강의를 수강하면서 제가 이해하기에는 난이도가 어렵다고 생각해 암호화만 쓸려고 했지만 2번째 반복하면서 첨부된 ppt의 구조를 크게 출력해서 포스트잇으로 자세하게 설명해 주신 내용을 붙이고 이해하면서 조금씩 포트폴리오에 시큐리티의 수강한 내용을 적용하고 있습니다. 시큐리티에 인증 부분은 조금 자신감이 생겨 디버그도 돌리면서 모르는 부분을 묻고 답변을 이해한게 뿌듯합니다^^ 좋은 강의 감사드리며 모르는 부분이 생기면 또 질문드리겠습니다. 잘부탁드립니다. 

권정현님의 프로필 이미지
권정현

작성한 질문수

질문하기