Skip to content

Commit ab92cae

Browse files
authored
Merge pull request #120 from Recipe-Project/feature/dev_improvements
fix: 탈퇴 후 로그인 불가 처리
2 parents 7d63a12 + 6234173 commit ab92cae

5 files changed

Lines changed: 56 additions & 6 deletions

File tree

src/main/java/com/recipe/app/src/common/config/JwtFilter.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,14 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha
3535
if (!StringUtils.hasText(accessToken)) {
3636
logger.info("필수 토큰이 없습니다., uri: {}", requestURI);
3737
} else if (jwtUtil.isValidAccessToken(accessToken)) {
38-
UserDetails userDetails = userDetailsService.loadUserByUsername(String.valueOf(jwtUtil.getUserId(accessToken)));
39-
Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, "", userDetails.getAuthorities());
40-
SecurityContextHolder.getContext().setAuthentication(authentication);
41-
logger.info("Security context에 인증 정보를 저장했습니다, uri: {}", requestURI);
38+
try {
39+
UserDetails userDetails = userDetailsService.loadUserByUsername(String.valueOf(jwtUtil.getUserId(accessToken)));
40+
Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, "", userDetails.getAuthorities());
41+
SecurityContextHolder.getContext().setAuthentication(authentication);
42+
logger.info("Security context에 인증 정보를 저장했습니다, uri: {}", requestURI);
43+
} catch (Exception e) {
44+
logger.info("사용자 인증에 실패했습니다. {}, uri: {}", e.getMessage(), requestURI);
45+
}
4246
} else {
4347
logger.info("유효한 Jwt 토큰이 없습니다, uri: {}", requestURI);
4448
}

src/main/java/com/recipe/app/src/user/application/CustomUserDetailsService.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.recipe.app.src.user.application;
22

33
import com.recipe.app.src.user.domain.SecurityUser;
4+
import com.recipe.app.src.user.domain.User;
45
import org.springframework.security.core.userdetails.UserDetails;
56
import org.springframework.security.core.userdetails.UserDetailsService;
67
import org.springframework.security.core.userdetails.UsernameNotFoundException;
@@ -20,6 +21,13 @@ public CustomUserDetailsService(UserService userService) {
2021
@Transactional(readOnly = true)
2122
@Override
2223
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
23-
return new SecurityUser(userService.findByUserId(Long.parseLong(username)));
24+
25+
User user = userService.findByUserId(Long.parseLong(username));
26+
27+
if (user.isDeleted()) {
28+
throw new UsernameNotFoundException("탈퇴한 사용자입니다.");
29+
}
30+
31+
return new SecurityUser(user);
2432
}
2533
}

src/main/java/com/recipe/app/src/user/application/UserService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,11 @@ public UserTokenRefreshResponse reissueToken(UserTokenRefreshRequest request) {
171171
throw new UserTokenNotExistException();
172172
}
173173

174+
User user = findByUserId(request.getUserId());
175+
if (user.isDeleted()) {
176+
throw new UserTokenNotExistException();
177+
}
178+
174179
return UserTokenRefreshResponse.builder()
175180
.userId(request.getUserId())
176181
.accessToken(jwtUtil.createAccessToken(request.getUserId()))

src/main/java/com/recipe/app/src/user/domain/UserWithdrawal.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public class UserWithdrawal {
2727
@Column(name = "userId", nullable = false)
2828
private Long userId;
2929

30-
@Column(name = "withdrawalReason", length = 200)
30+
@Column(name = "withdrawalReason")
3131
private String withdrawalReason;
3232

3333
@Column(name = "createdAt", nullable = false, updatable = false)

src/test/groovy/com/recipe/app/src/user/application/UserServiceTest.groovy

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,12 +420,19 @@ class UserServiceTest extends Specification {
420420
def "토큰 재발급"() {
421421

422422
given:
423+
User user = User.builder()
424+
.userId(1)
425+
.socialId("naver_1")
426+
.nickname("테스터1")
427+
.build()
428+
423429
UserTokenRefreshRequest request = UserTokenRefreshRequest.builder()
424430
.userId(1)
425431
.refreshToken("refresh_token")
426432
.build()
427433

428434
jwtUtil.isValidRefreshToken(request.refreshToken) >> true
435+
userRepository.findById(request.userId) >> Optional.of(user)
429436

430437
String accessToken = "new_access_token"
431438
String refreshToken = "new_refresh_token"
@@ -458,4 +465,30 @@ class UserServiceTest extends Specification {
458465
def e = thrown(UserTokenNotExistException.class)
459466
e.message == "유효하지 않은 JWT입니다."
460467
}
468+
469+
def "토큰 재발급 시 탈퇴한 사용자이면 예외 발생"() {
470+
471+
given:
472+
User user = User.builder()
473+
.userId(1)
474+
.socialId("naver_1")
475+
.nickname("테스터1")
476+
.build()
477+
user.markAsDeleted()
478+
479+
UserTokenRefreshRequest request = UserTokenRefreshRequest.builder()
480+
.userId(1)
481+
.refreshToken("refresh_token")
482+
.build()
483+
484+
jwtUtil.isValidRefreshToken(request.refreshToken) >> true
485+
userRepository.findById(request.userId) >> Optional.of(user)
486+
487+
when:
488+
userService.reissueToken(request)
489+
490+
then:
491+
def e = thrown(UserTokenNotExistException.class)
492+
e.message == "유효하지 않은 JWT입니다."
493+
}
461494
}

0 commit comments

Comments
 (0)