From 9278761c5ba4bde5378b2c70161bec2e909d070d Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 8 May 2026 16:50:42 +0900 Subject: [PATCH] =?UTF-8?q?fix(admin):=20=ED=81=AC=EB=A6=AC=EC=97=90?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EA=B4=80=EB=A6=AC=EC=9E=90=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=95=84=EC=9B=83=20AGENT=20=EA=B6=8C=ED=95=9C?= =?UTF-8?q?=EC=9D=84=20=ED=97=88=EC=9A=A9=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...8_크리에이터관리자로그아웃AGENT권한허용.md | 21 +++++++++++++++++ .../member/CreatorAdminMemberController.kt | 2 +- .../CreatorAdminMemberControllerTest.kt | 23 +++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 docs/20260508_크리에이터관리자로그아웃AGENT권한허용.md create mode 100644 src/test/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberControllerTest.kt diff --git a/docs/20260508_크리에이터관리자로그아웃AGENT권한허용.md b/docs/20260508_크리에이터관리자로그아웃AGENT권한허용.md new file mode 100644 index 00000000..fc11c8ca --- /dev/null +++ b/docs/20260508_크리에이터관리자로그아웃AGENT권한허용.md @@ -0,0 +1,21 @@ +# 크리에이터 관리자 로그아웃 AGENT 권한 허용 + +## 목표 +- `/creator-admin/member/logout` 엔드포인트를 `CREATOR`뿐 아니라 `AGENT` 권한 계정도 사용할 수 있게 한다. +- 로그인 로직이 이미 `CREATOR`, `AGENT`를 허용하는 기존 정책과 로그아웃 권한 조건을 맞춘다. + +## 구현 항목 +- [x] `CreatorAdminMemberController`의 `logout` 권한 조건에 `AGENT`를 추가한다. +- [x] `logout` 권한 조건이 `CREATOR`, `AGENT`를 모두 포함하는지 테스트로 검증한다. +- [x] 변경 파일 진단과 대상 테스트를 실행한다. + +## 검증 계획 +- `./gradlew test --tests "kr.co.vividnext.sodalive.creator.admin.member.CreatorAdminMemberControllerTest"` +- `lsp_diagnostics`로 변경 Kotlin 파일 오류 확인 + +## 검증 기록 +- `./gradlew test --tests "kr.co.vividnext.sodalive.creator.admin.member.CreatorAdminMemberControllerTest"`를 먼저 실행해 `hasRole('CREATOR')` 상태에서 실패함을 확인했다. +- `CreatorAdminMemberController.logout`의 `@PreAuthorize`를 `hasAnyRole('CREATOR', 'AGENT')`로 변경했다. +- 동일한 대상 테스트를 `--rerun-tasks`로 재실행해 `BUILD SUCCESSFUL`을 확인했다. +- `lsp_diagnostics`는 Kotlin(`.kt`) LSP 서버가 설정되어 있지 않아 실행할 수 없었다. Gradle 테스트 과정에서 Kotlin 컴파일과 테스트 컴파일은 정상 통과했다. +- 테스트 실행 중 기존 파일 `ImageBlurUtil.kt`의 미사용 파라미터 경고가 표시됐으며, 이번 변경 범위와는 무관해 수정하지 않았다. diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberController.kt index bd942a89..12909cb0 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberController.kt @@ -19,7 +19,7 @@ class CreatorAdminMemberController(private val service: CreatorAdminMemberServic fun login(@RequestBody loginRequest: LoginRequest) = service.login(loginRequest) @PostMapping("/logout") - @PreAuthorize("hasRole('CREATOR')") + @PreAuthorize("hasAnyRole('CREATOR', 'AGENT')") fun logout( @RequestHeader("Authorization") token: String, @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberControllerTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberControllerTest.kt new file mode 100644 index 00000000..3bc2291b --- /dev/null +++ b/src/test/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberControllerTest.kt @@ -0,0 +1,23 @@ +package kr.co.vividnext.sodalive.creator.admin.member + +import kr.co.vividnext.sodalive.member.Member +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test +import org.springframework.security.access.prepost.PreAuthorize + +class CreatorAdminMemberControllerTest { + @Test + @DisplayName("로그아웃은 크리에이터와 에이전트 권한을 허용한다") + fun shouldAllowCreatorAndAgentRolesForLogout() { + val logout = CreatorAdminMemberController::class.java.getDeclaredMethod( + "logout", + String::class.java, + Member::class.java + ) + + val preAuthorize = logout.getAnnotation(PreAuthorize::class.java) + + assertEquals("hasAnyRole('CREATOR', 'AGENT')", preAuthorize.value) + } +}