Skip to content

Conversation

@hyeminleeee
Copy link
Contributor

@hyeminleeee hyeminleeee commented Aug 29, 2025

📌 PR 개요

  • 서비스/컨트롤러에 분산되어 있던 권한 검증(if/DB 조회) 을 제거하고, Spring Security 메서드 시큐리티(@PreAuthorize) 기반으로 인가 로직을 보안 계층으로 분리했습니다.
  • JWT sub로 DB의 User.role을 조회해 ROLE_* 권한을 부여하는 JwtAuthConverterConfig 를 추가했습니다.
  • 권한 분리에 맞춰 보안 경계 테스트를 추가하고, 기존 단위 테스트에서 의미가 사라진 권한 예외 검증을 정리했습니다.

🔍 변경 사항

  • Security
    • SecurityConfig: @EnableMethodSecurity 활성화, JwtAuthenticationConverter 연결.
    • JwtAuthConverterConfig(신규): JWT의 sub로 UserRepository 조회 → User.role(DB: USER|ADMIN)을 GrantedAuthority("ROLE_" + role)로 매핑.
  • Controller / Service 인가 선언
    • UserAdminController: 하드코딩된 관리자 검증 제거 → @PreAuthorize("hasRole('ADMIN')")로 보호.
    • MatchService: createMatch() 내부의 admin if 제거 → @PreAuthorize("hasRole('ADMIN')")로 보호.
    • UserController: /signin-up, /me에 @PreAuthorize("isAuthenticated()") 명시(의도 드러냄).
  • Test
    • MatchServiceSecurityTest(신규): @EnableMethodSecurity + @WithMockUser로 ADMIN/USER 시나리오 검증.
    • 기존 MatchServiceTest의 “관리자 권한 없음 예외” 케이스 삭제/이관(서비스 내부 if 제거로 의미 소멸).

🧪 테스트 방법

1.단위 테스트 실행

  • ./gradlew test
  • MatchServiceTest 기존 비즈니스 로직 테스트 통과 확인.
  1. 보안 경계 테스트 실행
  • MatchServiceSecurityTest에서 아래 시나리오 확인:
    • @WithMockUser(roles="USER")로 createMatch() 호출 → AccessDeniedException 발생.
    • @WithMockUser(roles="ADMIN")로 createMatch() 호출 → 정상 통과.

✅ 체크리스트

  • 코드가 정상적으로 동작함
  • 기존 기능에 문제가 없음
  • 코드 컨벤션(Prettier/ESLint, Checkstyle 등)을 통과함
  • 필요 시 문서 업데이트 완료
  • 관련 이슈에 연결함

📎 참고 이슈

Ref: #82

@hyeminleeee hyeminleeee requested a review from a team August 29, 2025 15:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants