로그인후 컨트롤러에서 세션을 이용하는 것에 대해 문의 드립니다.
527
6 asked
혼자 시큐리티를 이용한 포트폴리오를 만들면서 세션문제를 만나
다른분께서 올리신 세션에 대한 질문을 보고 질문드리게 되었습니다
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 여부를 판별하는지 궁금합니다.
Answer 3
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의 구조를 크게 출력해서 포스트잇으로 자세하게 설명해 주신 내용을 붙이고 이해하면서 조금씩 포트폴리오에 시큐리티의 수강한 내용을 적용하고 있습니다. 시큐리티에 인증 부분은 조금 자신감이 생겨 디버그도 돌리면서 모르는 부분을 묻고 답변을 이해한게 뿌듯합니다^^ 좋은 강의 감사드리며 모르는 부분이 생기면 또 질문드리겠습니다. 잘부탁드립니다.
시큐리티 공부 버전 질문
0
175
1
[해결 방법] MethodSecurityConfig.customMethodSecurityMetadataSource() 호출하지 않는 이슈
0
186
1
AbstractSecurityInterceptor.class.beforeInvocation()를 2번 실행하는 경우
0
174
1
강의 코드가 왜이렇게 뒤죽박죽인가요...
0
249
1
메인 페이지로 접속해도 login url로 리다이렉트가 되지 않습니다..
0
236
1
파라미터값이 넘어가지 않습니다 ....
0
374
1
security filterChain 설정 질문이 있습니다.
0
331
1
소스 부분 질문 드립니다.
0
208
2
섹션4 7번 강의 문제가 있는거 같네요.
0
344
2
파일이 수시로 이름이 바껴있네요 ㄷㄷ
0
304
1
HttpSessionSecurityContextRepository를 사용안하는 문제
0
555
2
error , exception 이 잘 안됩니다.
0
281
2
thymeleaf tag 질문합니다.
0
196
2
버전업하면서 deprecated된 것들이 너무많아요
0
478
1
spring security 패치 관련
0
437
1
모바일을 사용할때 토큰말고 세션
0
846
2
DB 연동한 인가 부분에 대한 질문입니다!
0
264
1
Ajax방식도 똑같이 Session방식을 사용하는건가요?
0
307
1
Config 파일 생성 시 질문이 있습니다.
0
225
1
강사님 몇일동안 구글 검색만 100개 했는데도 이유를 모르겠습니다..
1
429
2
403 에러 뜹니다.
0
813
2
login_proc의 존재에 대한 간략한 설명입니다
0
276
1
top.html에 로그인 링크를 만들어서 로그인을 해봤습니다
0
282
2
안녕하세요. DB에 저장될 때 이해 안 가는 값이 있어서 질문드립니다!
0
189
1

