Compare commits
2 Commits
develop
...
feature/lo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6b3c68ee43 | ||
|
|
01db29c208 |
@@ -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) {
|
||||||
|
LogoutResponse logoutResponse = authenticationService.deleteRefreshToken(userRequest.getUsername());
|
||||||
|
|
||||||
|
return ResponseEntity.status(HttpStatus.OK)
|
||||||
|
.body(logoutResponse);
|
||||||
|
}
|
||||||
|
|
||||||
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,28 @@
|
|||||||
|
package com.ticketing.server.user.application.response;
|
||||||
|
|
||||||
|
import com.ticketing.server.global.redis.RefreshToken;
|
||||||
|
import lombok.AccessLevel;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor(access = AccessLevel.PRIVATE)
|
||||||
|
public class LogoutResponse {
|
||||||
|
|
||||||
|
private Long refreshTokenId;
|
||||||
|
private String email;
|
||||||
|
private String refreshToken;
|
||||||
|
|
||||||
|
private LogoutResponse(String email) {
|
||||||
|
this.email = email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static LogoutResponse from(String email) {
|
||||||
|
return new LogoutResponse(email);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static LogoutResponse from(RefreshToken refreshToken) {
|
||||||
|
return new LogoutResponse(refreshToken.getId(), refreshToken.getEmail(), refreshToken.getToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -9,6 +9,7 @@ import com.ticketing.server.global.redis.RefreshRedisRepository;
|
|||||||
import com.ticketing.server.global.redis.RefreshToken;
|
import com.ticketing.server.global.redis.RefreshToken;
|
||||||
import com.ticketing.server.global.security.jwt.JwtProperties;
|
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.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;
|
||||||
@@ -79,6 +80,16 @@ public class AuthenticationServiceImpl implements AuthenticationService {
|
|||||||
return tokenDto;
|
return tokenDto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public LogoutResponse deleteRefreshToken(String email) {
|
||||||
|
return refreshRedisRepository.findByEmail(email)
|
||||||
|
.map(tokenDto -> {
|
||||||
|
refreshRedisRepository.delete(tokenDto);
|
||||||
|
return LogoutResponse.from(tokenDto);
|
||||||
|
}).orElseGet(() -> LogoutResponse.from(email));
|
||||||
|
}
|
||||||
|
|
||||||
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);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.ticketing.server.user.service.interfaces;
|
package com.ticketing.server.user.service.interfaces;
|
||||||
|
|
||||||
|
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 org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
||||||
|
|
||||||
@@ -9,4 +10,6 @@ public interface AuthenticationService {
|
|||||||
|
|
||||||
TokenDto reissueTokenDto(String bearerRefreshToken);
|
TokenDto reissueTokenDto(String bearerRefreshToken);
|
||||||
|
|
||||||
|
LogoutResponse deleteRefreshToken(String email);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user