Skip to content

Commit

Permalink
Merge pull request #335 from IceButler/feature/#329-isLogin-resolver
Browse files Browse the repository at this point in the history
#329 로그인 리졸버 유저 검증 로직 추가
  • Loading branch information
psyeon1120 authored Jul 15, 2024
2 parents 98191d8 + d9589b3 commit 694ac05
Show file tree
Hide file tree
Showing 13 changed files with 116 additions and 92 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import com.example.icebutler_server.global.dto.response.SwaggerApiSuccess;
import com.example.icebutler_server.global.resolver.Auth;
import com.example.icebutler_server.global.resolver.IsLogin;
import com.example.icebutler_server.global.resolver.LoginStatus;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
Expand Down Expand Up @@ -44,8 +43,8 @@ public class CartController {
@Auth
@GetMapping("/{fridgeId}/foods")
public ResponseCustom<List<CartResponse>> getCartFoods(@Parameter(name = "냉장고 ID") @PathVariable Long fridgeId,
@Parameter(hidden = true) @IsLogin LoginStatus loginStatus) {
return ResponseCustom.success(cartService.getCartFoods(fridgeId, loginStatus.getUserId()));
@Parameter(hidden = true) @IsLogin Long userId) {
return ResponseCustom.success(cartService.getCartFoods(fridgeId, userId));
}

@Operation(summary = "장바구니 식품 추가", description = "장바구니에 식품을 추가한다.")
Expand All @@ -64,8 +63,8 @@ public ResponseCustom<List<CartResponse>> getCartFoods(@Parameter(name = "냉장
@PostMapping("/{fridgeId}/foods")
public ResponseCustom<?> addCartFoods(@Parameter(name = "냉장고 ID") @PathVariable Long fridgeId,
@RequestBody AddFoodToCartRequest request,
@Parameter(hidden = true) @IsLogin LoginStatus loginStatus) {
cartService.addCartFoods(fridgeId, request, loginStatus.getUserId());
@Parameter(hidden = true) @IsLogin Long userId) {
cartService.addCartFoods(fridgeId, request, userId);
return ResponseCustom.success();
}

Expand All @@ -85,8 +84,8 @@ public ResponseCustom<?> addCartFoods(@Parameter(name = "냉장고 ID") @PathVar
@DeleteMapping("/{fridgeId}/foods")
public ResponseCustom<?> deleteCartFoods(@Parameter(name = "냉장고 ID") @PathVariable Long fridgeId,
@RequestBody RemoveFoodFromCartRequest request,
@Parameter(hidden = true) @IsLogin LoginStatus loginStatus) {
cartService.deleteCartFoods(fridgeId, request, loginStatus.getUserId());
@Parameter(hidden = true) @IsLogin Long userId) {
cartService.deleteCartFoods(fridgeId, request, userId);
return ResponseCustom.success();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import com.example.icebutler_server.global.dto.response.SwaggerApiSuccess;
import com.example.icebutler_server.global.resolver.Auth;
import com.example.icebutler_server.global.resolver.IsLogin;
import com.example.icebutler_server.global.resolver.LoginStatus;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
Expand Down Expand Up @@ -46,8 +45,8 @@ public ResponseCustom<Void> healthCheck() {
@Auth
@PostMapping("/register")
public ResponseCustom<Long> registerFridge(@RequestBody FridgeRegisterReq fridgeRegisterReq,
@Parameter(hidden = true) @IsLogin LoginStatus loginStatus) {
return ResponseCustom.success(fridgeService.registerFridge(fridgeRegisterReq, loginStatus.getUserId()));
@Parameter(hidden = true) @IsLogin Long userId) {
return ResponseCustom.success(fridgeService.registerFridge(fridgeRegisterReq, userId));
}

@Operation(summary = "냉장고 정보 수정", description = "냉장고 정보를 수정한다.")
Expand All @@ -66,8 +65,8 @@ public ResponseCustom<Long> registerFridge(@RequestBody FridgeRegisterReq fridge
@PatchMapping("/{fridgeId}")
public ResponseCustom<?> modifyFridge(@Parameter(description = "냉장고 ID") @PathVariable Long fridgeId,
@RequestBody FridgeModifyReq fridgeModifyReq,
@Parameter(hidden = true) @IsLogin LoginStatus loginStatus) {
fridgeService.modifyFridge(fridgeId, fridgeModifyReq, loginStatus.getUserId());
@Parameter(hidden = true) @IsLogin Long userId) {
fridgeService.modifyFridge(fridgeId, fridgeModifyReq, userId);
return ResponseCustom.success();
}

Expand All @@ -87,8 +86,8 @@ public ResponseCustom<?> modifyFridge(@Parameter(description = "냉장고 ID") @
@Auth
@PatchMapping("/{fridgeId}/remove")
public ResponseCustom<Long> removeFridge(@Parameter(description = "냉장고 ID") @PathVariable Long fridgeId,
@Parameter(hidden = true) @IsLogin LoginStatus loginStatus) {
return ResponseCustom.success(fridgeService.removeFridge(fridgeId, loginStatus.getUserId()));
@Parameter(hidden = true) @IsLogin Long userId) {
return ResponseCustom.success(fridgeService.removeFridge(fridgeId, userId));
}

@Operation(summary = "냉장고 사용자 삭제", description = "냉장고 사용자를 삭제한다.")
Expand All @@ -104,8 +103,8 @@ public ResponseCustom<Long> removeFridge(@Parameter(description = "냉장고 ID"
@Auth
@PatchMapping("/{fridgeId}/remove/each")
public ResponseCustom<Long> removeFridgeUser(@Parameter(description = "냉장고 ID") @PathVariable Long fridgeId,
@Parameter(hidden = true) @IsLogin LoginStatus loginStatus) {
return ResponseCustom.success(fridgeService.removeFridgeUser(fridgeId, loginStatus.getUserId()));
@Parameter(hidden = true) @IsLogin Long userId) {
return ResponseCustom.success(fridgeService.removeFridgeUser(fridgeId, userId));
}

@Operation(summary = "냉장고 식품 전체 조회(카테고리별)", description = "냉장고 내 식품을 카테고리 별로 전체조회한다.")
Expand All @@ -121,8 +120,8 @@ public ResponseCustom<Long> removeFridgeUser(@Parameter(description = "냉장고
@GetMapping("/{fridgeId}/foods")
public ResponseCustom<FridgeMainRes> getFoods(@Parameter(description = "냉장고 ID") @PathVariable Long fridgeId,
@Parameter(description = "식품 카테고리") @RequestParam(required = false) String category,
@Parameter(hidden = true) @IsLogin LoginStatus loginStatus) {
return ResponseCustom.success(fridgeService.getFoods(fridgeId, loginStatus.getUserId(), category));
@Parameter(hidden = true) @IsLogin Long userId) {
return ResponseCustom.success(fridgeService.getFoods(fridgeId, userId, category));
}


Expand All @@ -136,8 +135,8 @@ public ResponseCustom<FridgeMainRes> getFoods(@Parameter(description = "냉장
@GetMapping("/{fridgeId}/search")
public ResponseCustom<List<FridgeFoodsRes>> searchFridgeFood(@Parameter(description = "냉장고 ID") @PathVariable Long fridgeId,
@Parameter(description = "식품명") @RequestParam String keyword,
@Parameter(hidden = true) @IsLogin LoginStatus loginStatus) {
return ResponseCustom.success(fridgeService.searchFridgeFood(fridgeId, loginStatus.getUserId(), keyword));
@Parameter(hidden = true) @IsLogin Long userId) {
return ResponseCustom.success(fridgeService.searchFridgeFood(fridgeId, userId, keyword));
}

@Operation(summary = "냉장고 식품 상세 조회", description = "냉장고 내 식품을 상세 조회한다.")
Expand All @@ -154,8 +153,8 @@ public ResponseCustom<List<FridgeFoodsRes>> searchFridgeFood(@Parameter(descript
@GetMapping("/{fridgeId}/foods/{fridgeFoodId}")
public ResponseCustom<FridgeFoodRes> getFridgeFood(@Parameter(description = "냉장고 ID") @PathVariable Long fridgeId,
@Parameter(description = "냉장고 내 식품 ID") @PathVariable Long fridgeFoodId,
@Parameter(hidden = true) @IsLogin LoginStatus loginStatus) {
return ResponseCustom.success(fridgeService.getFridgeFood(fridgeId, fridgeFoodId, loginStatus.getUserId()));
@Parameter(hidden = true) @IsLogin Long userId) {
return ResponseCustom.success(fridgeService.getFridgeFood(fridgeId, fridgeFoodId, userId));
}

@Operation(summary = "냉장고 식품 추가", description = "냉장고 내 식품을 추가한다.")
Expand All @@ -174,8 +173,8 @@ public ResponseCustom<FridgeFoodRes> getFridgeFood(@Parameter(description = "냉
@PostMapping("/{fridgeId}/food")
public ResponseCustom<?> addFridgeFood(@RequestBody FridgeFoodsReq fridgeFoodsReq,
@Parameter(description = "냉장고 ID") @PathVariable Long fridgeId,
@Parameter(hidden = true) @IsLogin LoginStatus loginStatus) {
fridgeService.addFridgeFood(fridgeFoodsReq, fridgeId, loginStatus.getUserId());
@Parameter(hidden = true) @IsLogin Long userId) {
fridgeService.addFridgeFood(fridgeFoodsReq, fridgeId, userId);
return ResponseCustom.success();
}

Expand All @@ -197,8 +196,8 @@ public ResponseCustom<?> addFridgeFood(@RequestBody FridgeFoodsReq fridgeFoodsRe
public ResponseCustom<?> modifyFridgeFood(@RequestBody FridgeFoodReq fridgeFoodReq,
@Parameter(description = "냉장고 ID") @PathVariable Long fridgeId,
@Parameter(description = "냉장고 내 식품 ID") @PathVariable Long fridgeFoodId,
@Parameter(hidden = true) @IsLogin LoginStatus loginStatus) {
fridgeService.modifyFridgeFood(fridgeId, fridgeFoodId, fridgeFoodReq, loginStatus.getUserId());
@Parameter(hidden = true) @IsLogin Long userId) {
fridgeService.modifyFridgeFood(fridgeId, fridgeFoodId, fridgeFoodReq, userId);
return ResponseCustom.success();
}

Expand All @@ -219,8 +218,8 @@ public ResponseCustom<?> modifyFridgeFood(@RequestBody FridgeFoodReq fridgeFoodR
public ResponseCustom<?> deleteFridgeFood(@RequestBody DeleteFridgeFoodsReq deleteFridgeFoodsReq,
@Parameter(description = "삭제 타입(폐기/섭취)") @RequestParam String type,
@Parameter(description = "냉장고 ID") @PathVariable Long fridgeId,
@Parameter(hidden = true) @IsLogin LoginStatus loginStatus) {
fridgeService.deleteFridgeFood(deleteFridgeFoodsReq, type, fridgeId, loginStatus.getUserId());
@Parameter(hidden = true) @IsLogin Long userId) {
fridgeService.deleteFridgeFood(deleteFridgeFoodsReq, type, fridgeId, userId);
return ResponseCustom.success();
}

Expand All @@ -234,8 +233,8 @@ public ResponseCustom<?> deleteFridgeFood(@RequestBody DeleteFridgeFoodsReq dele
@GetMapping("{fridgeId}/members")
public ResponseCustom<FridgeUserMainRes> getMembers(
@Parameter(description = "냉장고 ID") @PathVariable Long fridgeId,
@Parameter(hidden = true) @IsLogin LoginStatus loginStatus) {
return ResponseCustom.success(fridgeService.searchMembers(fridgeId, loginStatus.getUserId()));
@Parameter(hidden = true) @IsLogin Long userId) {
return ResponseCustom.success(fridgeService.searchMembers(fridgeId, userId));
}

@Operation(summary = "냉장고 선택목록 조회", description = "냉장고 선택목록을 조회한다.")
Expand All @@ -247,9 +246,9 @@ public ResponseCustom<FridgeUserMainRes> getMembers(
@Auth
@GetMapping("/select")
public ResponseCustom<SelectFridgesMainRes> selectFridges(
@Parameter(hidden = true) @IsLogin LoginStatus loginStatus
@Parameter(hidden = true) @IsLogin Long userId
) {
return ResponseCustom.success(fridgeService.selectFridges(loginStatus.getUserId()));
return ResponseCustom.success(fridgeService.selectFridges(userId));
}

@Operation(summary = "냉장고 목록 조회", description = "냉장고 목록을 조회한다.")
Expand All @@ -261,8 +260,8 @@ public ResponseCustom<SelectFridgesMainRes> selectFridges(
})
@Auth
@GetMapping("")
public ResponseCustom<GetFridgesMainRes> myFridge(@Parameter(hidden = true) @IsLogin LoginStatus loginStatus) {
return ResponseCustom.success(fridgeService.myFridge(loginStatus.getUserId()));
public ResponseCustom<GetFridgesMainRes> myFridge(@Parameter(hidden = true) @IsLogin Long userId) {
return ResponseCustom.success(fridgeService.myFridge(userId));
}

/**
Expand All @@ -286,8 +285,8 @@ public ResponseCustom<FridgeFoodsStatistics> getFridgeFoodStatistics(
@Parameter(description = "통계 타입(낭비/소비)") @RequestParam String deleteCategory,
@Parameter(description = "연도") @RequestParam Integer year,
@Parameter(description = "월") @RequestParam Integer month,
@Parameter(hidden = true) @IsLogin LoginStatus status) {
return ResponseCustom.success(fridgeService.getFridgeFoodStatistics(fridgeId, deleteCategory, status.getUserId(), year, month));
@Parameter(hidden = true) @IsLogin Long userId) {
return ResponseCustom.success(fridgeService.getFridgeFoodStatistics(fridgeId, deleteCategory, userId, year, month));
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,14 @@
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;

import java.sql.SQLException;
import java.time.format.DateTimeParseException;
import java.util.Objects;

@RestControllerAdvice
public class ExceptionAdvice {
@ExceptionHandler(BaseException.class)
protected ResponseEntity<ResponseCustom> handleBaseException(BaseException e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public enum ReturnCode {

// Auth
EXPIRED_TOKEN("A0000", HttpStatus.UNAUTHORIZED, "만료된 토큰입니다. 다시 발급해주세요."),
NULL_TOKEN("A0001", HttpStatus.BAD_REQUEST, "토큰을 입력해주세요."),

// Cart
NOT_FOUND_CART("C0000", HttpStatus.NOT_FOUND, "존재하지 않는 장바구니입니다."),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public interface RecipeServerClient {
ResponseCustom<Void> addAdmin(@RequestBody AdminReq adminReq);

@DeleteMapping("/admin/users/{userId}")
ResponseCustom<Void> withdrawUser(@PathVariable Long userId, @RequestHeader Map<String, String> requestHeader);
ResponseCustom<Void> withdrawUser(@PathVariable(value = "userId") Long userId, @RequestHeader Map<String, String> requestHeader);

@DeleteMapping("/foods")
void deleteFood(@RequestBody FoodReq foodReq);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,59 +2,75 @@

import com.example.icebutler_server.global.exception.BaseException;
import com.example.icebutler_server.global.util.TokenUtils;
import com.sun.istack.NotNull;
import com.example.icebutler_server.user.service.UserServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.core.MethodParameter;
import org.springframework.core.env.Environment;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import java.util.Objects;
import javax.validation.constraints.NotNull;

import static com.example.icebutler_server.global.exception.ReturnCode.INTERNAL_SERVER_ERROR;
import static com.example.icebutler_server.global.exception.ReturnCode.*;


@RequiredArgsConstructor
@Component
public class LoginResolver implements HandlerMethodArgumentResolver{
public class LoginResolver implements HandlerMethodArgumentResolver {

public static final String AUTH_HEADER_NAME = "Authorization";

private final TokenUtils tokenUtils;
private final Environment env;
private final UserServiceImpl userService;

@Override
public boolean supportsParameter(MethodParameter parameter)
{
return parameter.hasParameterAnnotation(IsLogin.class)
&&
LoginStatus.class.equals(parameter.getParameterType());
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(IsLogin.class) && Long.class.equals(parameter.getParameterType());
}

@Nullable
@Override
public Object resolveArgument(@NotNull MethodParameter parameter,
ModelAndViewContainer mavContainer,
ModelAndViewContainer modelAndViewContainer,
@NotNull NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception
{
Auth auth = parameter.getMethodAnnotation(Auth.class);
WebDataBinderFactory binderFactory) {
checkMethodValidation(parameter);
String header = getHeader(webRequest);
String accessToken = getAccessToken(header);
Long userId = getUserId(accessToken);
return userId;
}

if (auth == null)
private void checkMethodValidation(MethodParameter parameter) {
if (parameter.getMethodAnnotation(Auth.class) == null) {
throw new BaseException(INTERNAL_SERVER_ERROR);
}
}

String accessToken = webRequest.getHeader(Objects.requireNonNull(env.getProperty("jwt.auth-header")));
if(accessToken == null || !tokenUtils.isValidToken(tokenUtils.parseJustTokenFromFullToken(accessToken)))
return LoginStatus.getNotLoginStatus();

Long userId = Long.valueOf(tokenUtils.getUserIdFromFullToken(accessToken));
private static String getHeader(NativeWebRequest webRequest) {
String header = webRequest.getHeader(AUTH_HEADER_NAME);
if (!StringUtils.hasText(header)) {
throw new BaseException(NULL_TOKEN);
}
return header;
}

if (!auth.optional() && userId == null) {
return LoginStatus.getNotLoginStatus();
private String getAccessToken(String header) {
String accessToken = tokenUtils.separateAuthType(header);
tokenUtils.isValidToken(accessToken);
if (!tokenUtils.isTokenExists(accessToken)) {
throw new BaseException(EXPIRED_TOKEN);
}
return accessToken;
}

return LoginStatus.builder().isLogin(true).userId(userId).build();
private Long getUserId(String accessToken) {
Long userId = Long.valueOf(tokenUtils.getJwtContents(accessToken));
userService.validateUser(userId);
return userId;
}
}

This file was deleted.

Loading

0 comments on commit 694ac05

Please sign in to comment.