1. 개요
: 플러스 심화 주차 과제를 진행하며, 겪은 이슈에 대한 정리 및 회고
2. 트러블 슈팅
: AOP User ID null
● 배경
AdminAccessLoggingAspect - logBeforeChangeUserRole 메서드 실행 시 로그에 User ID : null 발생

● 원인
Spring Security 설정 후 HttpServletRequest에서 getAttribute("userId")로 정보를 가져오지 못함
● 해결방안 1
SecurityContextHolder를 활용하여 userId를 로그에 반환하도록 수정한다.
AdminAccessLoggingAspect에서 HttpServletRequest request.getAttribute("userId")를 사용하여 userId를 가져오고 있지만, 이는 JwtAuthenticationFilter에서 request.setAttribute("userId", userId)를 설정하지 않으면 null이 된다.
따라서, Spring Security로 변경 후에는 SecurityContextHolder를 활용하여 userId를 가져오는 방식으로 수정한다.

● 해결방안 2
Spring Security로 변경 후 UserAdminController에서 @AuthenticationPrincipal AuthUser authUser을 파라미터로 받는다. 그리고 authUser를 통해서 userId를 조회한다.
String userId = String.valueOf(authUser.getId());
3. Spring Security 관련 추가 학습 내용
(1) 코드 동작 순서
1.사용자가 로그인 후 JWT를 발급받음
2.사용자는 JWT를 포함하여 요청을 보냄 (Authorization: Bearer <TOKEN>)
3.Spring Security의 JwtAuthenticationFilter가 요청을 가로챔
4.JWT를 검증하고, 사용자 정보를 SecurityContextHolder에 저장
5.요청이 컨트롤러로 전달되고, @AuthenticationPrincipal 등을 사용하여 인증된 사용자 정보를 활용
(2) 권한 설정(ADMIN)
1번 방법) SecurityConfig에서 /admin/** 경로를 ADMIN 전용으로 설정
.requestMatchers("/admin/**").hasAuthority(UserRole.Authority.ADMIN)
2번 방법) UserAdminService에서 @PreAuthorize 또는 @Secured 사용
@PreAuthorize("hasAuthority('ROLE_ADMIN')")
'개발 > 부트캠프' 카테고리의 다른 글
본캠프 : @EnableJpaAuditing (0) | 2025.03.27 |
---|---|
본캠프 : methodargumentnotvalidexception (0) | 2025.03.27 |
본캠프 : JWT Stateless Spring Security (0) | 2025.03.17 |
본캠프 : JwtFilter - ArgumentResolver 실습 2(OncePerRequestFilter) (0) | 2025.03.14 |
본캠프 : QueryDSL (0) | 2025.03.13 |