Skip to content

Commit

Permalink
Merge pull request #290 from Myongji-Graduate/develop
Browse files Browse the repository at this point in the history
졸업을 부탁해 V2.1.1
  • Loading branch information
5uhwann authored Dec 3, 2024
2 parents dadfbac + e92125f commit 04da5d1
Show file tree
Hide file tree
Showing 329 changed files with 3,672 additions and 3,062 deletions.
2 changes: 1 addition & 1 deletion .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@
# the repo. Unless a later match takes precedence,
# @global-owner1 and @global-owner2 will be requested for
# review when someone opens a pull request.
* @stophwan @5uhwann @Hoya324
* @stophwan @5uhwann @k-kbk @tiemo0708
10 changes: 8 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ dependencies {
implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
implementation "com.querydsl:querydsl-apt:${queryDslVersion}"
// implementation 'org.flywaydb:flyway-core:6.4.2'
implementation 'org.springdoc:springdoc-openapi-ui:1.6.9'
implementation 'org.springdoc:springdoc-openapi-ui:1.6.15'
implementation 'io.sentry:sentry-logback:1.7.30'

runtimeOnly 'mysql:mysql-connector-java'
Expand All @@ -58,7 +58,13 @@ dependencies {
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'


testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
testImplementation 'org.testcontainers:testcontainers:1.19.0'
testImplementation 'org.testcontainers:mysql:1.19.0'
testImplementation 'org.testcontainers:junit-jupiter:1.19.0'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
}
tasks.named('test') {
useJUnitPlatform()
Expand Down
1 change: 0 additions & 1 deletion infra/localcontainer/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ services:
environment:
MYSQL_ROOT_PASSWORD: mysql
MYSQL_DATABASE: myongji_graduate
platform: linux/x86_64
restart: always

redis:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
package com.plzgraduate.myongjigraduatebe.auth.api.signin;

import javax.validation.Valid;

import org.springframework.web.bind.annotation.RequestBody;

import com.plzgraduate.myongjigraduatebe.auth.api.signin.dto.request.SignInRequest;
import com.plzgraduate.myongjigraduatebe.auth.api.signin.dto.response.TokenResponse;
import com.plzgraduate.myongjigraduatebe.core.meta.LoginUser;

import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import javax.validation.Valid;
import org.springframework.web.bind.annotation.RequestBody;

@Tag(name = "SignIn", description = "로그인 API")
public interface SignInApiPresentation {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,16 @@
package com.plzgraduate.myongjigraduatebe.auth.api.signin;

import javax.validation.Valid;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

import com.plzgraduate.myongjigraduatebe.auth.api.signin.dto.request.SignInRequest;
import com.plzgraduate.myongjigraduatebe.auth.application.usecase.signin.SignInUseCase;
import com.plzgraduate.myongjigraduatebe.auth.api.signin.dto.response.TokenResponse;
import com.plzgraduate.myongjigraduatebe.auth.application.usecase.signin.SignInUseCase;
import com.plzgraduate.myongjigraduatebe.core.meta.LoginUser;
import com.plzgraduate.myongjigraduatebe.core.meta.WebAdapter;

import javax.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

@WebAdapter
@RequestMapping("api/v1/auth")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package com.plzgraduate.myongjigraduatebe.auth.api.signin.dto.request;

import javax.validation.constraints.NotBlank;

import io.swagger.v3.oas.annotations.media.Schema;
import javax.validation.constraints.NotBlank;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand All @@ -24,5 +23,4 @@ private SignInRequest(String authId, String password) {
this.authId = authId;
this.password = password;
}

}
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
package com.plzgraduate.myongjigraduatebe.auth.api.token;

import javax.validation.Valid;

import org.springframework.web.bind.annotation.RequestBody;

import com.plzgraduate.myongjigraduatebe.auth.api.token.dto.request.TokenRequest;
import com.plzgraduate.myongjigraduatebe.auth.api.token.dto.response.AccessTokenResponse;

import io.swagger.v3.oas.annotations.tags.Tag;
import javax.validation.Valid;
import org.springframework.web.bind.annotation.RequestBody;

@Tag(name = "Token", description = "토큰 발급 API")
public interface TokenApiPresentation {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,14 @@
package com.plzgraduate.myongjigraduatebe.auth.api.token;

import javax.validation.Valid;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

import com.plzgraduate.myongjigraduatebe.auth.api.token.dto.request.TokenRequest;
import com.plzgraduate.myongjigraduatebe.auth.api.token.dto.response.AccessTokenResponse;
import com.plzgraduate.myongjigraduatebe.auth.application.usecase.token.TokenUseCase;
import com.plzgraduate.myongjigraduatebe.core.meta.WebAdapter;

import javax.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

@WebAdapter
@RequiredArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package com.plzgraduate.myongjigraduatebe.auth.api.token.dto.request;

import javax.validation.constraints.NotBlank;

import io.swagger.v3.oas.annotations.media.Schema;
import javax.validation.constraints.NotBlank;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand All @@ -19,5 +18,4 @@ public class TokenRequest {
private TokenRequest(String refreshToken) {
this.refreshToken = refreshToken;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@
import java.util.Optional;

public interface FindRefreshTokenPort {

Optional<Long> findByRefreshToken(String refreshToken);
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.plzgraduate.myongjigraduatebe.auth.application.port;


public interface SaveRefreshTokenPort {

void saveRefreshToken(String refreshToken, Long userId);
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,16 @@
package com.plzgraduate.myongjigraduatebe.auth.application.service.signin;

import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.transaction.annotation.Transactional;

import com.plzgraduate.myongjigraduatebe.auth.api.signin.dto.response.TokenResponse;
import com.plzgraduate.myongjigraduatebe.auth.application.port.SaveRefreshTokenPort;
import com.plzgraduate.myongjigraduatebe.auth.application.usecase.signin.SignInUseCase;
import com.plzgraduate.myongjigraduatebe.auth.security.JwtAuthenticationToken;
import com.plzgraduate.myongjigraduatebe.auth.security.TokenProvider;
import com.plzgraduate.myongjigraduatebe.core.meta.UseCase;

import lombok.RequiredArgsConstructor;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.transaction.annotation.Transactional;

@UseCase
@Transactional(readOnly = true)
Expand All @@ -37,8 +35,8 @@ private Authentication authenticateCommand(String authId, String password) {
JwtAuthenticationToken authenticationToken =
new JwtAuthenticationToken(authId, password);
Authentication authentication = authenticationManager.authenticate(authenticationToken);
SecurityContextHolder.getContext().setAuthentication(authentication);
SecurityContextHolder.getContext()
.setAuthentication(authentication);
return authentication;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import com.plzgraduate.myongjigraduatebe.auth.application.usecase.token.TokenUseCase;
import com.plzgraduate.myongjigraduatebe.auth.security.TokenProvider;
import com.plzgraduate.myongjigraduatebe.core.meta.UseCase;

import lombok.RequiredArgsConstructor;

@UseCase
Expand All @@ -15,6 +14,7 @@ public class TokenService implements TokenUseCase {
private final TokenProvider tokenProvider;

private final FindRefreshTokenPort findRefreshTokenPort;

@Override
public AccessTokenResponse generateNewToken(String refreshToken) {
Long userId = findByRefreshToken(refreshToken);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@
import com.plzgraduate.myongjigraduatebe.auth.api.signin.dto.response.TokenResponse;

public interface SignInUseCase {

TokenResponse signIn(String authId, String password);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@
import com.plzgraduate.myongjigraduatebe.auth.api.token.dto.response.AccessTokenResponse;

public interface TokenUseCase {

AccessTokenResponse generateNewToken(String refreshToken);
}
Original file line number Diff line number Diff line change
@@ -1,24 +1,22 @@
package com.plzgraduate.myongjigraduatebe.auth.infrastructure.adapter.repository;

import java.util.Optional;
import java.util.concurrent.TimeUnit;

import org.springframework.stereotype.Component;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.plzgraduate.myongjigraduatebe.auth.application.port.FindRefreshTokenPort;
import com.plzgraduate.myongjigraduatebe.auth.application.port.SaveRefreshTokenPort;

import java.util.Optional;
import java.util.concurrent.TimeUnit;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class InMemoryTokenRepository implements FindRefreshTokenPort, SaveRefreshTokenPort {

private static final Cache<String, Long> TOKEN_REPOSITORY = CacheBuilder.newBuilder()
.expireAfterWrite(15, TimeUnit.DAYS)
.build();

@Override
public void saveRefreshToken(String refreshToken, Long userId) {
TOKEN_REPOSITORY.put(refreshToken, userId);
Expand All @@ -28,5 +26,4 @@ public void saveRefreshToken(String refreshToken, Long userId) {
public Optional<Long> findByRefreshToken(String refreshToken) {
return Optional.ofNullable(TOKEN_REPOSITORY.getIfPresent(refreshToken));
}

}
Original file line number Diff line number Diff line change
@@ -1,29 +1,23 @@
package com.plzgraduate.myongjigraduatebe.auth.security;

import static com.plzgraduate.myongjigraduatebe.core.exception.ErrorCode.*;
import static com.plzgraduate.myongjigraduatebe.core.exception.ErrorCode.AUTHENTICATION_FAIL_FORBIDDEN;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.plzgraduate.myongjigraduatebe.core.exception.ExceptionResponse;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.http.HttpStatus;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.stereotype.Component;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.plzgraduate.myongjigraduatebe.core.exception.ErrorCode;
import com.plzgraduate.myongjigraduatebe.core.exception.ExceptionResponse;

import lombok.RequiredArgsConstructor;

@Component
@RequiredArgsConstructor
public class JwtAccessDeniedHandler implements AccessDeniedHandler {

private static final ExceptionResponse E403 = ExceptionResponse.from(AUTHENTICATION_FAIL_FORBIDDEN.toString());
private static final ExceptionResponse E403 = ExceptionResponse.from(
AUTHENTICATION_FAIL_FORBIDDEN.toString());

private final ObjectMapper om;

Expand All @@ -32,8 +26,11 @@ public void handle(HttpServletRequest request, HttpServletResponse response,
AccessDeniedException accessDeniedException) throws IOException {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
response.setHeader("content-type", "application/json");
response.getWriter().write(om.writeValueAsString(E403));
response.getWriter().flush();
response.getWriter().close();
response.getWriter()
.write(om.writeValueAsString(E403));
response.getWriter()
.flush();
response.getWriter()
.close();
}
}
Original file line number Diff line number Diff line change
@@ -1,28 +1,23 @@
package com.plzgraduate.myongjigraduatebe.auth.security;

import static com.plzgraduate.myongjigraduatebe.core.exception.ErrorCode.*;
import static com.plzgraduate.myongjigraduatebe.core.exception.ErrorCode.AUTHENTICATION_FAIL_UNAUTHORIZED;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.plzgraduate.myongjigraduatebe.core.exception.ExceptionResponse;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.http.HttpStatus;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.plzgraduate.myongjigraduatebe.core.exception.ErrorCode;
import com.plzgraduate.myongjigraduatebe.core.exception.ExceptionResponse;

import lombok.RequiredArgsConstructor;

@Component
@RequiredArgsConstructor
public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {
private static final ExceptionResponse E401 = ExceptionResponse.from(AUTHENTICATION_FAIL_UNAUTHORIZED.toString());

private static final ExceptionResponse E401 = ExceptionResponse.from(
AUTHENTICATION_FAIL_UNAUTHORIZED.toString());

private final ObjectMapper om;

Expand All @@ -31,8 +26,11 @@ public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.setHeader("content-type", "application/json");
response.getWriter().write(om.writeValueAsString(E401));
response.getWriter().flush();
response.getWriter().close();
response.getWriter()
.write(om.writeValueAsString(E401));
response.getWriter()
.flush();
response.getWriter()
.close();
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.plzgraduate.myongjigraduatebe.auth.security;

import java.util.Collection;

import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.core.GrantedAuthority;

Expand All @@ -19,7 +18,8 @@ public JwtAuthenticationToken(String principal, String credentials) {
this.credentials = credentials;
}

public JwtAuthenticationToken(Object principal, String credentials, Collection<? extends GrantedAuthority> authorities) {
public JwtAuthenticationToken(Object principal, String credentials,
Collection<? extends GrantedAuthority> authorities) {
super(authorities);
super.setAuthenticated(true);

Expand All @@ -42,5 +42,4 @@ public void eraseCredentials() {
super.eraseCredentials();
credentials = null;
}

}
Loading

0 comments on commit 04da5d1

Please sign in to comment.