-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: 사용자 인증 로직을 구현한다.
- Loading branch information
Showing
21 changed files
with
605 additions
and
13 deletions.
There are no files selected for viewing
3 changes: 3 additions & 0 deletions
3
src/main/java/com/seong/shoutlink/domain/auth/JwtProvider.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,11 @@ | ||
package com.seong.shoutlink.domain.auth; | ||
|
||
import com.seong.shoutlink.domain.auth.service.response.ClaimsResponse; | ||
import com.seong.shoutlink.domain.auth.service.response.TokenResponse; | ||
import com.seong.shoutlink.domain.member.MemberRole; | ||
|
||
public interface JwtProvider { | ||
TokenResponse createToken(Long memberId, MemberRole memberRole); | ||
|
||
ClaimsResponse parseAccessToken(String accessToken); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
8 changes: 8 additions & 0 deletions
8
src/main/java/com/seong/shoutlink/domain/auth/service/response/ClaimsResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
package com.seong.shoutlink.domain.auth.service.response; | ||
|
||
import com.seong.shoutlink.domain.member.MemberRole; | ||
import java.util.List; | ||
|
||
public record ClaimsResponse(Long memberId, MemberRole memberRole, List<String> authorities) { | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
12 changes: 12 additions & 0 deletions
12
src/main/java/com/seong/shoutlink/global/auth/authentication/Authentication.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package com.seong.shoutlink.global.auth.authentication; | ||
|
||
import java.util.List; | ||
|
||
public interface Authentication { | ||
|
||
Long getPrincipal(); | ||
|
||
List<String> getAuthorities(); | ||
|
||
String getCredentials(); | ||
} |
23 changes: 23 additions & 0 deletions
23
src/main/java/com/seong/shoutlink/global/auth/authentication/AuthenticationContext.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
package com.seong.shoutlink.global.auth.authentication; | ||
|
||
import lombok.extern.slf4j.Slf4j; | ||
|
||
@Slf4j | ||
public class AuthenticationContext { | ||
|
||
private final ThreadLocal<Authentication> context = new ThreadLocal<>(); | ||
|
||
public void setAuthentication(Authentication authentication) { | ||
context.set(authentication); | ||
log.debug("[Auth] 인증 컨텍스트 설정됨"); | ||
} | ||
|
||
public Authentication getAuthentication() { | ||
return context.get(); | ||
} | ||
|
||
public void releaseContext() { | ||
context.remove(); | ||
log.debug("[Auth] 인증 컨텍스트 소멸됨"); | ||
} | ||
} |
25 changes: 25 additions & 0 deletions
25
src/main/java/com/seong/shoutlink/global/auth/authentication/JwtAuthentication.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
package com.seong.shoutlink.global.auth.authentication; | ||
|
||
import com.seong.shoutlink.domain.member.MemberRole; | ||
import java.util.List; | ||
|
||
public record JwtAuthentication( | ||
Long memberId, | ||
MemberRole memberRole, | ||
String accessToken) implements Authentication { | ||
|
||
@Override | ||
public Long getPrincipal() { | ||
return memberId; | ||
} | ||
|
||
@Override | ||
public List<String> getAuthorities() { | ||
return memberRole.getAuthorities(); | ||
} | ||
|
||
@Override | ||
public String getCredentials() { | ||
return accessToken; | ||
} | ||
} |
55 changes: 55 additions & 0 deletions
55
...ain/java/com/seong/shoutlink/global/auth/authentication/JwtAuthenticationInterceptor.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
package com.seong.shoutlink.global.auth.authentication; | ||
|
||
import com.seong.shoutlink.global.exception.ErrorCode; | ||
import com.seong.shoutlink.global.exception.ShoutLinkException; | ||
import jakarta.servlet.http.HttpServletRequest; | ||
import jakarta.servlet.http.HttpServletResponse; | ||
import java.util.Objects; | ||
import lombok.RequiredArgsConstructor; | ||
import lombok.extern.slf4j.Slf4j; | ||
import org.springframework.web.servlet.HandlerInterceptor; | ||
|
||
@Slf4j | ||
@RequiredArgsConstructor | ||
public class JwtAuthenticationInterceptor implements HandlerInterceptor { | ||
|
||
private static final String HEADER = "Authorization"; | ||
private static final String BEARER = "Bearer "; | ||
|
||
private final JwtAuthenticationProvider jwtAuthenticationProvider; | ||
private final AuthenticationContext authenticationContext; | ||
|
||
@Override | ||
public boolean preHandle( | ||
HttpServletRequest request, | ||
HttpServletResponse response, | ||
Object handler) { | ||
log.debug("[Auth] JWT 인증 인터셉터 시작"); | ||
String bearerAccessToken = request.getHeader(HEADER); | ||
if(Objects.nonNull(bearerAccessToken)) { | ||
log.debug("[Auth] JWT 인증 프로세스 시작"); | ||
String accessToken = removeBearer(bearerAccessToken); | ||
JwtAuthentication authentication = jwtAuthenticationProvider.authenticate(accessToken); | ||
authenticationContext.setAuthentication(authentication); | ||
log.debug("[Auth] JWT 인증 프로세스 종료. 사용자 인증됨. {}", authentication); | ||
} | ||
log.debug("[Auth] Jwt 인증 인터셉터 종료"); | ||
return true; | ||
} | ||
|
||
private String removeBearer(String bearerAccessToken) { | ||
if(!bearerAccessToken.contains(BEARER)) { | ||
throw new ShoutLinkException("올바르지 않은 액세스 토큰 형식입니다.", ErrorCode.INVALID_ACCESS_TOKEN); | ||
} | ||
return bearerAccessToken.replace(BEARER, ""); | ||
} | ||
|
||
@Override | ||
public void afterCompletion( | ||
HttpServletRequest request, | ||
HttpServletResponse response, | ||
Object handler, | ||
Exception ex) { | ||
authenticationContext.releaseContext(); | ||
} | ||
} |
16 changes: 16 additions & 0 deletions
16
src/main/java/com/seong/shoutlink/global/auth/authentication/JwtAuthenticationProvider.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
package com.seong.shoutlink.global.auth.authentication; | ||
|
||
import com.seong.shoutlink.domain.auth.JwtProvider; | ||
import com.seong.shoutlink.domain.auth.service.response.ClaimsResponse; | ||
import lombok.RequiredArgsConstructor; | ||
|
||
@RequiredArgsConstructor | ||
public class JwtAuthenticationProvider { | ||
|
||
private final JwtProvider jwtProvider; | ||
|
||
public JwtAuthentication authenticate(String accessToken) { | ||
ClaimsResponse claims = jwtProvider.parseAccessToken(accessToken); | ||
return new JwtAuthentication(claims.memberId(), claims.memberRole(), accessToken); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
25 changes: 25 additions & 0 deletions
25
src/main/java/com/seong/shoutlink/global/config/WebConfig.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
package com.seong.shoutlink.global.config; | ||
|
||
import com.seong.shoutlink.global.auth.authentication.AuthenticationContext; | ||
import com.seong.shoutlink.global.auth.authentication.JwtAuthenticationInterceptor; | ||
import com.seong.shoutlink.global.auth.authentication.JwtAuthenticationProvider; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.context.annotation.Configuration; | ||
import org.springframework.web.servlet.config.annotation.InterceptorRegistry; | ||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; | ||
|
||
@Configuration | ||
@RequiredArgsConstructor | ||
public class WebConfig implements WebMvcConfigurer { | ||
|
||
private final JwtAuthenticationProvider jwtAuthenticationProvider; | ||
private final AuthenticationContext authenticationContext; | ||
|
||
@Override | ||
public void addInterceptors(InterceptorRegistry registry) { | ||
registry.addInterceptor( | ||
new JwtAuthenticationInterceptor(jwtAuthenticationProvider, authenticationContext)) | ||
.order(1) | ||
.addPathPatterns("/api/**"); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
16 changes: 16 additions & 0 deletions
16
src/test/java/com/seong/shoutlink/fixture/AuthFixture.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
package com.seong.shoutlink.fixture; | ||
|
||
import com.seong.shoutlink.domain.auth.JwtProvider; | ||
import com.seong.shoutlink.global.auth.jwt.JJwtProvider; | ||
|
||
public final class AuthFixture { | ||
|
||
public static JwtProvider jwtProvider() { | ||
String issuer = "test"; | ||
int expirySeconds = 3600; | ||
int refreshExpirySeconds = 18000; | ||
String secret = "thisisjusttestaccesssecretsodontworry"; | ||
String refreshSecret = "thisisjusttestrefreshsecretsodontworry"; | ||
return new JJwtProvider(issuer, expirySeconds, refreshExpirySeconds, secret, refreshSecret); | ||
} | ||
} |
Oops, something went wrong.