feat: 로그아웃 시 refreshToken 제거
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package com.ticketing.server.user.application;
|
package com.ticketing.server.user.application;
|
||||||
|
|
||||||
import com.ticketing.server.user.application.request.LoginRequest;
|
import com.ticketing.server.user.application.request.LoginRequest;
|
||||||
|
import com.ticketing.server.user.application.response.LogoutResponse;
|
||||||
import com.ticketing.server.user.application.response.TokenDto;
|
import com.ticketing.server.user.application.response.TokenDto;
|
||||||
import com.ticketing.server.user.service.interfaces.AuthenticationService;
|
import com.ticketing.server.user.service.interfaces.AuthenticationService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@@ -8,6 +9,8 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.springframework.http.HttpHeaders;
|
import org.springframework.http.HttpHeaders;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
||||||
|
import org.springframework.security.core.userdetails.UserDetails;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
@@ -40,6 +43,14 @@ public class AuthController {
|
|||||||
.body(tokenDto);
|
.body(tokenDto);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PostMapping("/logout")
|
||||||
|
public ResponseEntity<LogoutResponse> logout(@AuthenticationPrincipal UserDetails userRequest) {
|
||||||
|
authenticationService.deleteRefreshToken(userRequest.getUsername());
|
||||||
|
|
||||||
|
return ResponseEntity.status(HttpStatus.OK)
|
||||||
|
.body(LogoutResponse.from(userRequest.getUsername()));
|
||||||
|
}
|
||||||
|
|
||||||
private HttpHeaders getHttpHeaders() {
|
private HttpHeaders getHttpHeaders() {
|
||||||
HttpHeaders httpHeaders = new HttpHeaders();
|
HttpHeaders httpHeaders = new HttpHeaders();
|
||||||
httpHeaders.set(HttpHeaders.CACHE_CONTROL, "no-cache, no-store, must-revalidate");
|
httpHeaders.set(HttpHeaders.CACHE_CONTROL, "no-cache, no-store, must-revalidate");
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package com.ticketing.server.user.application.response;
|
||||||
|
|
||||||
|
import lombok.AccessLevel;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor(access = AccessLevel.PRIVATE)
|
||||||
|
public class LogoutResponse {
|
||||||
|
|
||||||
|
private String email;
|
||||||
|
|
||||||
|
public static LogoutResponse from(String email) {
|
||||||
|
return new LogoutResponse(email);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -11,6 +11,7 @@ import com.ticketing.server.global.security.jwt.JwtProperties;
|
|||||||
import com.ticketing.server.global.security.jwt.JwtProvider;
|
import com.ticketing.server.global.security.jwt.JwtProvider;
|
||||||
import com.ticketing.server.user.application.response.TokenDto;
|
import com.ticketing.server.user.application.response.TokenDto;
|
||||||
import com.ticketing.server.user.service.interfaces.AuthenticationService;
|
import com.ticketing.server.user.service.interfaces.AuthenticationService;
|
||||||
|
import java.util.Optional;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
||||||
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
|
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
|
||||||
@@ -79,6 +80,19 @@ public class AuthenticationServiceImpl implements AuthenticationService {
|
|||||||
return tokenDto;
|
return tokenDto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public boolean deleteRefreshToken(String email) {
|
||||||
|
Optional<RefreshToken> findTokenEntity = refreshRedisRepository.findByEmail(email);
|
||||||
|
|
||||||
|
if (findTokenEntity.isPresent()) {
|
||||||
|
refreshRedisRepository.delete(findTokenEntity.get());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private String resolveToken(String bearerToken) {
|
private String resolveToken(String bearerToken) {
|
||||||
if (StringUtils.hasText(bearerToken) && jwtProperties.hasTokenStartsWith(bearerToken)) {
|
if (StringUtils.hasText(bearerToken) && jwtProperties.hasTokenStartsWith(bearerToken)) {
|
||||||
return bearerToken.substring(7);
|
return bearerToken.substring(7);
|
||||||
|
|||||||
@@ -9,4 +9,6 @@ public interface AuthenticationService {
|
|||||||
|
|
||||||
TokenDto reissueTokenDto(String bearerRefreshToken);
|
TokenDto reissueTokenDto(String bearerRefreshToken);
|
||||||
|
|
||||||
|
boolean deleteRefreshToken(String email);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user