Skip to content

Commit 05de7b6

Browse files
authored
๐Ÿ› [Fix] ์‚ฌ์šฉ์ž ํƒˆํ‡ด ์‹œ ๋กœ๊ทธ์•„์›ƒ ๋˜๋„๋ก ์ˆ˜์ • (#113)
2 parents 4c70fac + 4245d5e commit 05de7b6

File tree

5 files changed

+66
-18
lines changed

5 files changed

+66
-18
lines changed

โ€Žsrc/main/java/org/withtime/be/withtimebe/domain/auth/service/command/AuthCommandServiceImpl.javaโ€Ž

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.withtime.be.withtimebe.global.error.exception.*;
2121
import org.withtime.be.withtimebe.global.security.constants.AuthenticationConstants;
2222
import org.withtime.be.withtimebe.global.security.domain.CustomUserDetails;
23+
import org.withtime.be.withtimebe.global.security.handler.CustomLogoutHandler;
2324
import org.withtime.be.withtimebe.global.util.CookieUtil;
2425

2526
@Service
@@ -36,6 +37,7 @@ public class AuthCommandServiceImpl implements AuthCommandService {
3637
private final TokenQueryService tokenQueryService;
3738
private final TokenStorageQueryService tokenStorageQueryService;
3839
private final EmailVerificationCodeStorageQueryService emailVerificationCodeStorageQueryService;
40+
private final CustomLogoutHandler customLogoutHandler;
3941

4042
@Override
4143
public void signUp(AuthRequestDTO.SignUp request) {
@@ -69,19 +71,7 @@ public void reissueToken(HttpServletRequest request, HttpServletResponse respons
6971

7072
@Override
7173
public void logout(HttpServletRequest request, HttpServletResponse response) {
72-
String accessToken = getAccessToken(request);
73-
String refreshToken = getRefreshToken(request);
74-
75-
tokenStorageCommandService.addBlackList(accessToken);
76-
tokenStorageCommandService.addBlackList(refreshToken);
77-
78-
// ์ฟ ํ‚ค์˜ Refresh Token์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด Redis Refresh๋„ Black list ์ฒ˜๋ฆฌ
79-
Long userId = getUserId(refreshToken);
80-
tokenStorageCommandService.addBlackList(tokenStorageQueryService.getRefreshToken(userId));
81-
tokenStorageCommandService.deleteRefreshToken(userId);
82-
83-
CookieUtil.deleteCookie(request, response, AuthenticationConstants.ACCESS_TOKEN_NAME);
84-
CookieUtil.deleteCookie(request, response, AuthenticationConstants.REFRESH_TOKEN_NAME);
74+
customLogoutHandler.logout(request, response);
8575
}
8676

8777
@Override

โ€Žsrc/main/java/org/withtime/be/withtimebe/domain/member/controller/MemberController.javaโ€Ž

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import io.swagger.v3.oas.annotations.responses.ApiResponse;
55
import io.swagger.v3.oas.annotations.responses.ApiResponses;
66
import io.swagger.v3.oas.annotations.tags.Tag;
7+
import jakarta.servlet.http.HttpServletRequest;
8+
import jakarta.servlet.http.HttpServletResponse;
79
import lombok.RequiredArgsConstructor;
810
import org.namul.api.payload.response.DefaultResponse;
911

@@ -79,8 +81,8 @@ public DefaultResponse<MemberResponseDTO.ChangeInfo> changeInfo(@AuthenticatedMe
7981
@Operation(summary = "ํšŒ์› ํƒˆํ‡ดํ•˜๊ธฐ API by ์š”์‹œ", description = "๋กœ๊ทธ์ธ๋œ ํ† ํฐ์„ ์ด์šฉํ•˜์—ฌ ํšŒ์› ํƒˆํ‡ดํ•˜๋Š” API")
8082
@ApiResponse(responseCode = "204", description = "ํšŒ์› ํƒˆํ‡ด ์„ฑ๊ณต (soft delete)")
8183
@DeleteMapping
82-
public DefaultResponse<Void> deleteMember(@AuthenticatedMember Member member) {
83-
memberCommandService.deleteMember(member.getId());
84+
public DefaultResponse<Void> deleteMember(HttpServletRequest request, HttpServletResponse response, @AuthenticatedMember Member member) {
85+
memberCommandService.deleteMember(request, response, member.getId());
8486
return DefaultResponse.noContent();
8587
}
8688

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.withtime.be.withtimebe.domain.member.service.command;
22

3+
import jakarta.servlet.http.HttpServletRequest;
4+
import jakarta.servlet.http.HttpServletResponse;
35
import org.withtime.be.withtimebe.domain.member.dto.MemberRequestDTO;
46
import org.withtime.be.withtimebe.domain.member.entity.Member;
57

@@ -8,5 +10,5 @@ public interface MemberCommandService {
810
void changePassword(String email, String password);
911
Member changeInfo(Long memberId, MemberRequestDTO.ChangeInfo request);
1012
void addPoint(Long memberId, Integer point);
11-
void deleteMember(Long memberId);
13+
void deleteMember(HttpServletRequest request, HttpServletResponse response, Long memberId);
1214
}

โ€Žsrc/main/java/org/withtime/be/withtimebe/domain/member/service/command/MemberCommandServiceImpl.javaโ€Ž

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
package org.withtime.be.withtimebe.domain.member.service.command;
22

3+
import jakarta.servlet.http.HttpServletRequest;
4+
import jakarta.servlet.http.HttpServletResponse;
35
import lombok.RequiredArgsConstructor;
46
import org.namul.api.payload.error.exception.ServerApplicationException;
57
import org.springframework.security.crypto.password.PasswordEncoder;
68
import org.springframework.stereotype.Service;
79
import org.springframework.transaction.annotation.Transactional;
10+
import org.withtime.be.withtimebe.domain.auth.service.command.AuthCommandService;
811
import org.withtime.be.withtimebe.domain.member.dto.MemberRequestDTO;
912
import org.withtime.be.withtimebe.domain.member.entity.Member;
1013
import org.withtime.be.withtimebe.domain.member.repository.MemberRepository;
1114
import org.withtime.be.withtimebe.global.error.code.AuthErrorCode;
1215
import org.withtime.be.withtimebe.global.error.code.MemberErrorCode;
1316
import org.withtime.be.withtimebe.global.error.exception.AuthException;
1417
import org.withtime.be.withtimebe.global.error.exception.MemberException;
18+
import org.withtime.be.withtimebe.global.security.handler.CustomLogoutHandler;
1519

1620
@Service
1721
@RequiredArgsConstructor
@@ -20,6 +24,7 @@ public class MemberCommandServiceImpl implements MemberCommandService {
2024

2125
private final PasswordEncoder passwordEncoder;
2226
private final MemberRepository memberRepository;
27+
private final CustomLogoutHandler customLogoutHandler;
2328

2429

2530
@Override
@@ -52,8 +57,10 @@ public void addPoint(Long memberId, Integer point) {
5257
new MemberException(MemberErrorCode.NOT_FOUND));
5358
member.addPoint(point);
5459
}
55-
56-
public void deleteMember(Long memberId) {
60+
61+
@Override
62+
public void deleteMember(HttpServletRequest request, HttpServletResponse response, Long memberId) {
63+
customLogoutHandler.logout(request, response);
5764
memberRepository.deleteById(memberId);
5865
}
5966

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package org.withtime.be.withtimebe.global.security.handler;
2+
3+
import jakarta.servlet.http.HttpServletRequest;
4+
import jakarta.servlet.http.HttpServletResponse;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.stereotype.Component;
7+
import org.withtime.be.withtimebe.domain.auth.service.command.TokenStorageCommandService;
8+
import org.withtime.be.withtimebe.domain.auth.service.query.TokenQueryService;
9+
import org.withtime.be.withtimebe.domain.auth.service.query.TokenStorageQueryService;
10+
import org.withtime.be.withtimebe.global.security.constants.AuthenticationConstants;
11+
import org.withtime.be.withtimebe.global.util.CookieUtil;
12+
13+
@Component
14+
@RequiredArgsConstructor
15+
public class CustomLogoutHandler {
16+
17+
private final TokenStorageCommandService tokenStorageCommandService;
18+
private final TokenStorageQueryService tokenStorageQueryService;
19+
private final TokenQueryService tokenQueryService;
20+
21+
public void logout(HttpServletRequest request, HttpServletResponse response) {
22+
String accessToken = getAccessToken(request);
23+
String refreshToken = getRefreshToken(request);
24+
25+
tokenStorageCommandService.addBlackList(accessToken);
26+
tokenStorageCommandService.addBlackList(refreshToken);
27+
28+
// ์ฟ ํ‚ค์˜ Refresh Token์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด Redis Refresh๋„ Black list ์ฒ˜๋ฆฌ
29+
Long userId = getUserId(refreshToken);
30+
tokenStorageCommandService.addBlackList(tokenStorageQueryService.getRefreshToken(userId));
31+
tokenStorageCommandService.deleteRefreshToken(userId);
32+
33+
CookieUtil.deleteCookie(request, response, AuthenticationConstants.ACCESS_TOKEN_NAME);
34+
CookieUtil.deleteCookie(request, response, AuthenticationConstants.REFRESH_TOKEN_NAME);
35+
}
36+
37+
private Long getUserId(String token) {
38+
return tokenQueryService.getUserId(token);
39+
}
40+
41+
private String getAccessToken(HttpServletRequest request) {
42+
return CookieUtil.getCookie(request, AuthenticationConstants.ACCESS_TOKEN_NAME);
43+
}
44+
45+
private String getRefreshToken(HttpServletRequest request) {
46+
return CookieUtil.getCookie(request, AuthenticationConstants.REFRESH_TOKEN_NAME);
47+
}}

0 commit comments

Comments
ย (0)