Skip to content

Commit

Permalink
🔨 fix(dev): 디렉토리 도메인 구조로 변경 #4
Browse files Browse the repository at this point in the history
  • Loading branch information
gengminy committed Sep 17, 2022
1 parent d31bb6f commit b5bd67a
Show file tree
Hide file tree
Showing 37 changed files with 273 additions and 85 deletions.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package com.tikitaka.naechinso.controller;
package com.tikitaka.naechinso.domain.sms;

import com.tikitaka.naechinso.config.CommonApiResponse;
import com.tikitaka.naechinso.dto.SmsCertificationRequestDTO;
import com.tikitaka.naechinso.dto.SmsVerificationCodeRequestDTO;
import com.tikitaka.naechinso.service.SmsCertificationService;
import com.tikitaka.naechinso.global.config.CommonApiResponse;
import com.tikitaka.naechinso.domain.sms.dto.SmsCertificationRequestDTO;
import com.tikitaka.naechinso.domain.sms.dto.SmsVerificationCodeRequestDTO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.tikitaka.naechinso.service;
package com.tikitaka.naechinso.domain.sms;

import com.tikitaka.naechinso.dto.SmsCertificationRequestDTO;
import com.tikitaka.naechinso.domain.sms.dto.SmsCertificationRequestDTO;
import org.springframework.stereotype.Service;

@Service
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package com.tikitaka.naechinso.service;
package com.tikitaka.naechinso.domain.sms;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.tikitaka.naechinso.constant.ErrorCode;
import com.tikitaka.naechinso.dto.NaverSmsMessageDTO;
import com.tikitaka.naechinso.dto.NaverSmsRequestDTO;
import com.tikitaka.naechinso.dto.SmsCertificationRequestDTO;
import com.tikitaka.naechinso.dto.NaverSmsResponseDTO;
import com.tikitaka.naechinso.exception.BadRequestException;
import com.tikitaka.naechinso.exception.UnauthorizedException;
import com.tikitaka.naechinso.global.error.ErrorCode;
import com.tikitaka.naechinso.infra.sms.dto.NaverSmsMessageDTO;
import com.tikitaka.naechinso.infra.sms.dto.NaverSmsRequestDTO;
import com.tikitaka.naechinso.domain.sms.dto.SmsCertificationRequestDTO;
import com.tikitaka.naechinso.infra.sms.dto.NaverSmsResponseDTO;
import com.tikitaka.naechinso.global.error.exception.BadRequestException;
import com.tikitaka.naechinso.global.error.exception.UnauthorizedException;
import com.tikitaka.naechinso.global.config.redis.RedisService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.codec.binary.Base64;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.tikitaka.naechinso.dto;
package com.tikitaka.naechinso.domain.sms.dto;

import lombok.*;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.tikitaka.naechinso.dto;
package com.tikitaka.naechinso.domain.sms.dto;

import lombok.*;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.tikitaka.naechinso.global.common.request;


import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;

/** JWT Token 요청 Dto
* @author gengminy (220917)
*/
@Getter
@ToString
@NoArgsConstructor
public class TokenRequestDTO {
private String accessToken;
private String refreshToken;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.tikitaka.naechinso.global.common.response;

import lombok.*;

/** JWT Token 응답 Dto
* @author gengminy (220728) */
@Getter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class TokenResponseDTO {
private String accessToken;
private String refreshToken;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.tikitaka.naechinso.config;
package com.tikitaka.naechinso.global.config;

import lombok.AllArgsConstructor;
import lombok.Getter;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.tikitaka.naechinso.config;
package com.tikitaka.naechinso.global.config;

import io.netty.channel.ChannelOption;
import io.netty.handler.timeout.ReadTimeoutHandler;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.tikitaka.naechinso.entity.base;
package com.tikitaka.naechinso.global.config.entity;

import com.tikitaka.naechinso.constant.DeleteStatus;
import com.tikitaka.naechinso.global.constant.DeleteStatus;
import lombok.Getter;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.tikitaka.naechinso.entity.base;
package com.tikitaka.naechinso.global.config.entity;

import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.tikitaka.naechinso.config;
package com.tikitaka.naechinso.global.config.redis;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.tikitaka.naechinso.service;
package com.tikitaka.naechinso.global.config.redis;

import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.tikitaka.naechinso.service;
package com.tikitaka.naechinso.global.config.redis;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
//package com.tikitaka.naechinso.global.config.security;
//
//import com.tikitaka.naechinso.global.config.security.JwtTokenProvider;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.security.core.context.SecurityContextHolder;
//import org.springframework.stereotype.Component;
//import org.springframework.web.filter.OncePerRequestFilter;
//
//import javax.servlet.FilterChain;
//import javax.servlet.ServletException;
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.io.IOException;
//
//@Slf4j
//@Component
//@RequiredArgsConstructor
//public class JwtAuthenticationFilter extends OncePerRequestFilter {
// private final JwtTokenProvider jwtTokenService;
//
// @Override
// protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
// throws ServletException, IOException {
// try {
// String jwt = resolveToken(request); //request에서 jwt 토큰을 꺼낸다.
//
// if (jwt == null) {
// filterChain.doFilter(request, response);
// return;
// }
//
// System.out.println("jwt = " + jwt); //test
//
// if (StringUtils.isNotEmpty(jwt) && jwtTokenService.validateToken(jwt)) {
// jwtTokenService authentication = jwtTokenService.getAuthentication(jwt); //authentication 획득
//// authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); //기본적으로 제공한 details 세팅
//
// //Security 세션에서 계속 사용하기 위해 SecurityContext에 Authentication 등록
// SecurityContextHolder.getContext().setAuthentication(authentication);
// } else {
// if (StringUtils.isEmpty(jwt)) {
// request.setAttribute("unauthorization", "401 인증키 없음.");
// }
//
// if (jwtTokenService.validateToken(jwt)) {
// request.setAttribute("unauthorization", "401-001 인증키 만료.");
// }
// }
// } catch (Exception ex) {
// logger.error("Security Context에 해당 토큰을 등록할 수 없습니다", ex);
// }
//
// filterChain.doFilter(request, response);
// }
//
// private String resolveToken(HttpServletRequest request) {
// String bearerToken = request.getHeader("Authorization");
// //Prefix 로 Bearer 가 있으면 제거
// if (StringUtils.isNotEmpty(bearerToken) && bearerToken.startsWith("Bearer ")) {
// return bearerToken.substring("Bearer ".length());
// }
// //Prefix 가 없으면 그대로
// return bearerToken;
// }
//}
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package com.tikitaka.naechinso.global.config.security;

import com.tikitaka.naechinso.global.error.ErrorCode;
import com.tikitaka.naechinso.global.error.exception.BadRequestException;
import com.tikitaka.naechinso.global.error.exception.UnauthorizedException;
import com.tikitaka.naechinso.global.config.redis.RedisService;
import io.jsonwebtoken.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.Base64;
import java.util.Collection;
import java.util.stream.Collectors;

@Slf4j
@Component
@RequiredArgsConstructor
public class JwtTokenProvider {
private final RedisService redisService;
/** 토큰 비밀 키 */
@Value("${JWT_SECRET_KEY}")
private String JWT_SECRET;

/** 토큰 유효 시간 (ms) */
private static final long JWT_EXPIRATION_MS = 1000L * 60 * 30; //30분
private static final long REFRESH_TOKEN_EXPIRATION_MS = 1000L * 60 * 60 * 24 * 7; //7일

private static final String AUTHORITIES_KEY = "role"; //권한 정보 컬럼명



public Authentication getAuthentication(String accessToken) {
Claims claims = parseClaims(accessToken);

if (claims.get(AUTHORITIES_KEY) == null) {
throw new UnauthorizedException(ErrorCode.INVALID_AUTH_TOKEN);
}

//권한 정보 가져오기
Collection<? extends GrantedAuthority> authorities =
Arrays.stream(claims.get(AUTHORITIES_KEY).toString().split(","))
.map(SimpleGrantedAuthority::new)
.collect(Collectors.toList());

//Authentication 리턴
UserDetails principal = new User(claims.getSubject(), "", authorities);
return new UsernamePasswordAuthenticationToken(principal, "", authorities);
}


/**
* JWT 유효성 검사
* @param token 검사하려는 JWT 토큰
* @returns boolean
* @throws SignatureException 서명이 다를때
* @throws MalformedJwtException JWT 구조가 아닐때
* @throws ExpiredJwtException 만료기간이 지났을때
* @throws UnsupportedJwtException 지원 불가
* @throws IllegalArgumentException 매개변수 전달 오류
*/
public boolean validateToken(String token) {
final String encodedKey = Base64.getEncoder().encodeToString(JWT_SECRET.getBytes());
try {
Jwts.parser().setSigningKey(encodedKey).parseClaimsJws(token);
return true;
} catch (SignatureException | MalformedJwtException ex) {
log.error("잘못된 JWT 서명입니다");
} catch (ExpiredJwtException ex) {
log.error("만료된 JWT 토큰입니다");
} catch (UnsupportedJwtException ex) {
log.error("지원하지 않는 JWT 토큰입니다");
} catch (IllegalArgumentException ex) {
log.error("JWT 토큰이 비어있습니다");
}
return false;
}

/** Redis Memory 의 RefreshToken 과
* User 의 RefreshToken 이 일치하는지 확인
* @param userId 검증하려는 유저 아이디
* @param refreshToken 검증하려는 리프레시 토큰
*/
public void validateRefreshToken(String userId, String refreshToken) {
String redisRt = redisService.getValues(userId);
if (!refreshToken.equals(redisRt)) {
throw new BadRequestException(ErrorCode.EXPIRED_TOKEN);
}
}

/**
* JWT 토큰에서 claims 추출
* @param accessToken 추출하고 싶은 AccessToken (JWT)
* @return Claims
*/
public Claims parseClaims(String accessToken) {
final String encodedKey = Base64.getEncoder().encodeToString(JWT_SECRET.getBytes());

try {
return Jwts.parser()
.setSigningKey(encodedKey)
.parseClaimsJws(accessToken)
.getBody();
} catch (ExpiredJwtException e) {
return e.getClaims();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.tikitaka.naechinso.config;
package com.tikitaka.naechinso.global.config.security;


import lombok.RequiredArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.tikitaka.naechinso.config;
package com.tikitaka.naechinso.global.config.swagger;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.tikitaka.naechinso.controller;
package com.tikitaka.naechinso.global.config.swagger;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.tikitaka.naechinso.global.constant;

public enum DeleteStatus {
Y,N
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.tikitaka.naechinso.constant;
package com.tikitaka.naechinso.global.error;

import lombok.AllArgsConstructor;
import lombok.Getter;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
package com.tikitaka.naechinso.config;
package com.tikitaka.naechinso.global.error;

import com.tikitaka.naechinso.constant.ErrorCode;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.lang.Nullable;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;

Expand Down
Loading

0 comments on commit b5bd67a

Please sign in to comment.