Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ public ResponseEntity<String> createPost(
@GetMapping("/{postId}")
public ResponseEntity<PostDetailResponseDto> getPost(
@PathVariable Long postId,
@AuthenticationPrincipal @Nullable User currentUser) {
@AuthenticationPrincipal @Nullable User currentUser // 로그인 안 해도 null
) {
PostDetailResponseDto response = postService.getPost(postId, currentUser);
return ResponseEntity.ok(response);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,14 @@ public interface PostRepository extends JpaRepository<Post, Long> {
@Query("SELECT p FROM Post p WHERE p.category = :category ORDER BY p.createdAt DESC")
Slice<Post> findAllActivePostsByCategory(@Param("category") Category category, Pageable pageable);

@Query("SELECT DISTINCT p FROM Post p " +
@Query("SELECT p FROM Post p " +
"LEFT JOIN FETCH p.author " +
"LEFT JOIN FETCH p.comments c " +
"LEFT JOIN FETCH c.author " +
"LEFT JOIN FETCH c.children cc " +
"LEFT JOIN FETCH cc.author " +
"WHERE p.id = :id AND p.isDeleted = false")
Optional<Post> findActivePostWithCommentsById(@Param("id") Long id);


@Query("SELECT p FROM Post p WHERE p.author = :author ORDER BY p.createdAt DESC")
Slice<Post> findActivePostsByAuthor(@Param("author") User author, Pageable pageable);
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
public class JwtAuthenticationFilter extends OncePerRequestFilter {

private final JwtTokenProvider jwtTokenProvider;
private final UserDetailsService userDetailsService; // CustomUserDetailsService 주입
private final UserDetailsService userDetailsService;

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
Expand All @@ -27,36 +27,40 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
String path = request.getRequestURI();

// === 1. 광고 업로드/조회 API는 인증 없이 통과 ===
if (path.startsWith("/api/ads")) { // /api/ads 또는 /api/ads/… 전부 허용
if (path.startsWith("/api/ads")) {
filterChain.doFilter(request, response);
return;
}

// 1. 요청 헤더에서 토큰 추출
String token = resolveToken(request);

// 2. 토큰 유효성 검증
if (token != null && jwtTokenProvider.validateToken(token)) {
// 3. 토큰에서 사용자 정보(email) 가져오기
// === 2. 토큰이 없으면 (비로그인 요청) 그냥 통과 ===
if (token == null) {
filterChain.doFilter(request, response);
return;
}

// === 3. 토큰이 유효하면 인증 객체 생성 ===
if (jwtTokenProvider.validateToken(token)) {
String email = jwtTokenProvider.getEmail(token);
// 4. UserDetailsService를 통해 UserDetails 객체 가져오기
UserDetails userDetails = userDetailsService.loadUserByUsername(email);
// 5. Authentication 객체 생성 및 SecurityContext에 저장

Authentication authentication =
new UsernamePasswordAuthenticationToken(userDetails, "", userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
}

// 다음 필터로 요청 전달
// 4. 다음 필터로 요청 전달
filterChain.doFilter(request, response);
}

// 요청 헤더에서 'Bearer ' 토큰을 추출하는 메소드
// 요청 헤더에서 'Bearer ' 토큰 추출
private String resolveToken(HttpServletRequest request) {
String bearerToken = request.getHeader("Authorization");
if (bearerToken != null && bearerToken.startsWith("Bearer ")) {
return bearerToken.substring(7);
}
return null;
}
}
}