Skip to content

Commit ecfe047

Browse files
authored
Merge pull request #25 from MT-TEAM-Org/feat/PH-97
유저의 상태가 ACTIVE 가 아닌 경우 토큰 발급 되지 않도록 처리
2 parents b9496ae + 47651d8 commit ecfe047

File tree

10 files changed

+94
-17
lines changed

10 files changed

+94
-17
lines changed

src/main/java/org/myteam/server/auth/service/ReIssueService.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,16 +100,17 @@ public Tokens reissueTokens(HttpServletRequest request) {
100100
// Refresh Token 검증
101101
UUID publicId = jwtProvider.getPublicId(refresh);
102102
String role = jwtProvider.getRole(refresh);
103+
String status = jwtProvider.getStatus(refresh);
103104

104105
log.info("publicId: {}, role: {}", publicId, role);
105106

106107
validateRefreshToken(refresh, publicId);
107108

108109
// 새로운 Access 및 Refresh 토큰 생성
109110
// Authorization
110-
String newAccess = jwtProvider.generateToken(TOKEN_CATEGORY_ACCESS, Duration.ofMinutes(10), publicId, role);
111+
String newAccess = jwtProvider.generateToken(TOKEN_CATEGORY_ACCESS, Duration.ofMinutes(10), publicId, role, status);
111112
// X-Refresh-Token
112-
String newRefresh = jwtProvider.generateToken(TOKEN_CATEGORY_REFRESH, Duration.ofHours(24), publicId, role);
113+
String newRefresh = jwtProvider.generateToken(TOKEN_CATEGORY_REFRESH, Duration.ofHours(24), publicId, role, status);
113114

114115
// 기존 리프레시 토큰 삭제
115116
deleteByRefreshAndPublicId(refresh, publicId);

src/main/java/org/myteam/server/global/security/dto/CustomUserDetails.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ public UUID getPublicId() {
4545
return member.getPublicId();
4646
}
4747

48+
public String getStatus() {return member.getStatus().name(); }
49+
4850
@Override
4951
public boolean isAccountNonExpired() {
5052
return true;

src/main/java/org/myteam/server/global/security/filter/JwtAuthenticationFilter.java

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import static org.myteam.server.auth.controller.ReIssueController.TOKEN_REISSUE_PATH;
3030
import static org.myteam.server.global.security.jwt.JwtProvider.TOKEN_CATEGORY_ACCESS;
3131
import static org.myteam.server.global.security.jwt.JwtProvider.TOKEN_CATEGORY_REFRESH;
32+
import static org.myteam.server.member.domain.MemberStatus.*;
3233
import static org.myteam.server.util.cookie.CookieUtil.createCookie;
3334

3435
@Slf4j
@@ -76,9 +77,25 @@ protected void successfulAuthentication(HttpServletRequest request, HttpServletR
7677

7778
String username = customUserDetails.getUsername();
7879
UUID publicId = customUserDetails.getPublicId();
80+
String status = customUserDetails.getStatus();
7981

8082
log.info("successfulAuthentication > username : {}", username);
8183
log.info("successfulAuthentication > publicId : {}", publicId);
84+
log.info("successfulAuthentication > status : {}", status);
85+
86+
if (status.equals(PENDING.name())) {
87+
log.warn("PENDING 상태인 경우 로그인이 불가능합니다");
88+
sendErrorResponse(response, HttpStatus.FORBIDDEN, "PENDING 상태인 경우 로그인이 불가능합니다");
89+
return;
90+
} else if (status.equals(INACTIVE.name())) {
91+
log.warn("INACTIVE 상태인 경우 로그인이 불가능합니다");
92+
sendErrorResponse(response, HttpStatus.FORBIDDEN, "INACTIVE 상태인 경우 로그인이 불가능합니다");
93+
return;
94+
} else if (!status.equals(ACTIVE.name())) {
95+
log.warn("알 수 없는 유저 상태 코드 : " + status);
96+
sendErrorResponse(response, HttpStatus.FORBIDDEN, "알 수 없는 유저 상태 코드 : " + status);
97+
return;
98+
}
8299

83100
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
84101
Iterator<? extends GrantedAuthority> iterator = authorities.iterator();
@@ -88,9 +105,9 @@ protected void successfulAuthentication(HttpServletRequest request, HttpServletR
88105
String role = auth.getAuthority();
89106

90107
// Authorization
91-
String accessToken = jwtProvider.generateToken(TOKEN_CATEGORY_ACCESS, Duration.ofMinutes(10), publicId, role);
108+
String accessToken = jwtProvider.generateToken(TOKEN_CATEGORY_ACCESS, Duration.ofMinutes(10), publicId, role, status);
92109
// X-Refresh-Token
93-
String refreshToken = jwtProvider.generateToken(TOKEN_CATEGORY_REFRESH, Duration.ofHours(24), publicId, role);
110+
String refreshToken = jwtProvider.generateToken(TOKEN_CATEGORY_REFRESH, Duration.ofHours(24), publicId, role, status);
94111
// URLEncoder.encode: 공백을 %2B 로 처리
95112
String cookieValue = URLEncoder.encode("Bearer " + refreshToken, StandardCharsets.UTF_8);
96113

@@ -136,4 +153,19 @@ public void addRefreshEntity(UUID publicId, String refresh, Duration duration) {
136153

137154
refreshJpaRepository.save(refreshEntity);
138155
}
156+
157+
/**
158+
* 공통 에러 응답 처리 메서드
159+
*
160+
* @param response HttpServletResponse
161+
* @param httpStatus HTTP 상태 오브젝트
162+
* @param message 메시지
163+
* @throws IOException
164+
*/
165+
private void sendErrorResponse(HttpServletResponse response, HttpStatus httpStatus, String message) throws IOException {
166+
response.setStatus(httpStatus.value());
167+
response.setContentType("application/json");
168+
response.setCharacterEncoding("UTF-8");
169+
response.getWriter().write(String.format("{\"message\":\"%s\",\"status\":\"%s\"}", message, httpStatus.name()));
170+
}
139171
}

src/main/java/org/myteam/server/global/security/filter/TokenAuthenticationFilter.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.myteam.server.global.security.dto.CustomUserDetails;
1515
import org.myteam.server.global.security.jwt.JwtProvider;
1616
import org.myteam.server.member.domain.MemberRole;
17+
import org.myteam.server.member.domain.MemberStatus;
1718
import org.myteam.server.member.entity.Member;
1819
import org.springframework.http.HttpStatus;
1920
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
@@ -53,14 +54,17 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
5354
// 토큰에서 username과 role 획득
5455
UUID publicId = jwtProvider.getPublicId(accessToken);
5556
String role = jwtProvider.getRole(accessToken);
57+
String status = jwtProvider.getStatus(accessToken);
5658

5759
log.info("publicId : " + publicId);
5860
log.info("role : " + role);
61+
log.info("status : " + status);
5962

6063
// Member 를 생성하여 값 set
6164
Member member = Member.builder()
6265
.publicId(publicId)
6366
.role(MemberRole.valueOf(role))
67+
.status(MemberStatus.valueOf(status))
6468
.build();
6569

6670
CustomUserDetails customUserDetails = new CustomUserDetails(member);

src/main/java/org/myteam/server/global/security/jwt/JwtProvider.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ public class JwtProvider {
3434
* @param role String
3535
* @return String
3636
*/
37-
public String generateToken(String category, Duration duration, UUID publicId, String role) {
37+
public String generateToken(String category, Duration duration, UUID publicId, String role, String status) {
3838
Date now = new Date();
39-
return makeToken(category, new Date(now.getTime() + duration.toMillis()), publicId, role);
39+
return makeToken(category, new Date(now.getTime() + duration.toMillis()), publicId, role, status);
4040
}
4141

4242
/**
@@ -47,14 +47,15 @@ public String generateToken(String category, Duration duration, UUID publicId, S
4747
* @param role 권한
4848
* @return
4949
*/
50-
private String makeToken(String category, Date expirationDate, UUID publicId, String role) {
50+
private String makeToken(String category, Date expirationDate, UUID publicId, String role, String status) {
5151
return Jwts.builder()
5252
.issuer(jwtProperties.getIssuer())
5353
.issuedAt(new Date())
5454
.expiration(expirationDate)
5555
.claim("category", category)
5656
.claim("id", publicId)
5757
.claim("role", role)
58+
.claim("status", status)
5859
.signWith(getSigningKey())
5960
.compact();
6061
}
@@ -111,6 +112,17 @@ public String getRole(final String token) {
111112
return claims.get("role", String.class);
112113
}
113114

115+
/**
116+
* 토큰으로부터 사용자 상태(status)을 추출
117+
*
118+
* @param token String
119+
* @return String
120+
*/
121+
public String getStatus(final String token) {
122+
Claims claims = getClaims(token);
123+
return claims.get("status", String.class);
124+
}
125+
114126
/**
115127
* 토큰으로부터 Claims를 가져옴
116128
*

src/main/java/org/myteam/server/member/controller/MemberController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public ResponseEntity<?> updateRole(@RequestBody @Valid MemberRoleUpdateRequest
8686
public ResponseEntity<?> getToken(@PathVariable String email) {
8787
log.info("getToken 메서드가 실행되었습니다.");
8888
MemberResponse response = memberService.getByEmail(email);
89-
String encode = TOKEN_PREFIX + jwtProvider.generateToken(TOKEN_CATEGORY_ACCESS, Duration.ofHours(6), response.getPublicId(), MemberRole.USER.name());
89+
String encode = TOKEN_PREFIX + jwtProvider.generateToken(TOKEN_CATEGORY_ACCESS, Duration.ofHours(6), response.getPublicId(), MemberRole.USER.name(), response.getStatus().name());
9090
return new ResponseEntity<>(new ResponseDto<>(SUCCESS.name(), "토큰 조회 성공", encode), HttpStatus.OK);
9191
}
9292
}

src/main/java/org/myteam/server/member/controller/MyInfoController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ public ResponseEntity<?> create(@RequestBody @Valid MemberSaveRequest memberSave
4848
MemberResponse response = memberService.create(memberSaveRequest);
4949

5050
// Authorization
51-
String accessToken = jwtProvider.generateToken(TOKEN_CATEGORY_ACCESS, Duration.ofMinutes(10), response.getPublicId(), response.getRole().name());
51+
String accessToken = jwtProvider.generateToken(TOKEN_CATEGORY_ACCESS, Duration.ofMinutes(10), response.getPublicId(), response.getRole().name(), response.getStatus().name());
5252
// X-Refresh-Token
53-
String refreshToken = jwtProvider.generateToken(TOKEN_CATEGORY_REFRESH, Duration.ofHours(24), response.getPublicId(), response.getRole().name());
53+
String refreshToken = jwtProvider.generateToken(TOKEN_CATEGORY_REFRESH, Duration.ofHours(24), response.getPublicId(), response.getRole().name(), response.getStatus().name());
5454
// URLEncoder.encode: 공백을 %2B 로 처리
5555
String cookieValue = URLEncoder.encode("Bearer " + refreshToken, StandardCharsets.UTF_8);
5656

src/main/java/org/myteam/server/oauth2/dto/CustomOAuth2User.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.myteam.server.oauth2.dto;
22

33
import lombok.Getter;
4+
import org.myteam.server.member.domain.MemberStatus;
45
import org.springframework.security.core.GrantedAuthority;
56
import org.springframework.security.oauth2.core.user.OAuth2User;
67

@@ -15,10 +16,12 @@ public class CustomOAuth2User implements OAuth2User {
1516
private String username;
1617
private String role;
1718
private UUID publicId;
18-
public CustomOAuth2User(String username, String role, UUID publicId) {
19+
private MemberStatus status;
20+
public CustomOAuth2User(String username, String role, UUID publicId, MemberStatus status) {
1921
this.username = username;
2022
this.role = role;
2123
this.publicId = publicId;
24+
this.status = status;
2225
}
2326
@Override
2427
public <A> A getAttribute(String name) {
@@ -47,4 +50,5 @@ public String getName() {
4750
}
4851

4952
public UUID getPublicId() { return publicId; }
53+
public MemberStatus getStatus() { return status; }
5054
}

src/main/java/org/myteam/server/oauth2/handler/CustomOauth2SuccessHandler.java

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import static org.myteam.server.auth.controller.ReIssueController.LOGOUT_PATH;
2525
import static org.myteam.server.auth.controller.ReIssueController.TOKEN_REISSUE_PATH;
2626
import static org.myteam.server.global.security.jwt.JwtProvider.*;
27+
import static org.myteam.server.member.domain.MemberStatus.*;
2728
import static org.myteam.server.util.cookie.CookieUtil.createCookie;
2829

2930
@Slf4j
@@ -43,13 +44,33 @@ public CustomOauth2SuccessHandler(JwtProvider jwtProvider, MemberJpaRepository m
4344

4445
@Override
4546
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
46-
log.info("onAuthenticationSuccess : Oauth 로그인 성공");
47+
log.info("onAuthenticationSuccess : Oauth 인증 성공");
4748
CustomOAuth2User customUserDetails = (CustomOAuth2User) authentication.getPrincipal();
49+
4850
String email = customUserDetails.getUsername();
4951
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
5052
Iterator<? extends GrantedAuthority> iterator = authorities.iterator();
5153
GrantedAuthority auth = iterator.next();
5254
String role = auth.getAuthority();
55+
String status = customUserDetails.getStatus().name();
56+
57+
if (status.equals(PENDING.name())) {
58+
log.warn("PENDING 상태인 경우 로그인이 불가능합니다");
59+
// sendErrorResponse(response, HttpStatus.FORBIDDEN, "PENDING 상태인 경우 로그인이 불가능합니다");
60+
response.sendRedirect(frontUrl + "?status=" + status);
61+
return;
62+
} else if (status.equals(INACTIVE.name())) {
63+
log.warn("INACTIVE 상태인 경우 로그인이 불가능합니다");
64+
// sendErrorResponse(response, HttpStatus.FORBIDDEN, "INACTIVE 상태인 경우 로그인이 불가능합니다");
65+
response.sendRedirect(frontUrl + "?status=" + status);
66+
return;
67+
} else if (!status.equals(ACTIVE.name())) {
68+
log.warn("알 수 없는 유저 상태 코드 : " + status);
69+
// sendErrorResponse(response, HttpStatus.FORBIDDEN, "INACTIVE 상태인 경우 로그인이 불가능합니다");
70+
response.sendRedirect(frontUrl + "?status=" + status);
71+
return;
72+
}
73+
5374
log.info("onAuthenticationSuccess email: {}", email);
5475
log.info("onAuthenticationSuccess role: {}", role);
5576
//유저확인
@@ -58,9 +79,9 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo
5879
log.info("onAuthenticationSuccess publicId: {}", member.getPublicId());
5980
log.info("onAuthenticationSuccess role: {}", member.getRole());
6081
// Authorization
61-
String accessToken = jwtProvider.generateToken(TOKEN_CATEGORY_ACCESS, Duration.ofHours(1), member.getPublicId(), member.getRole().name());
82+
String accessToken = jwtProvider.generateToken(TOKEN_CATEGORY_ACCESS, Duration.ofHours(1), member.getPublicId(), member.getRole().name(), member.getStatus().name());
6283
// X-Refresh-Token
63-
String refreshToken = jwtProvider.generateToken(TOKEN_CATEGORY_REFRESH, Duration.ofDays(7), member.getPublicId(), member.getRole().name());
84+
String refreshToken = jwtProvider.generateToken(TOKEN_CATEGORY_REFRESH, Duration.ofDays(7), member.getPublicId(), member.getRole().name(), member.getStatus().name());
6485
String cookieValue = URLEncoder.encode("Bearer " + refreshToken, StandardCharsets.UTF_8);
6586

6687
// redirect 순간 Header 값 날아감

src/main/java/org/myteam/server/oauth2/service/CustomOAuth2UserService.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import org.myteam.server.member.domain.MemberType;
88
import org.myteam.server.member.entity.Member;
99
import org.myteam.server.member.repository.MemberJpaRepository;
10-
import org.myteam.server.oauth2.constant.OAuth2ServiceProvider;
1110
import org.myteam.server.oauth2.dto.CustomOAuth2User;
1211
import org.myteam.server.oauth2.response.*;
1312
import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
@@ -87,11 +86,13 @@ private OAuth2User handleExistingMember(Member member, OAuth2Response oAuth2Resp
8786
log.debug("name : {}", oAuth2Response.getName());
8887
log.debug("provider : {}", oAuth2Response.getProvider());
8988
log.debug("provider.name : {}", MemberType.fromOAuth2Provider(oAuth2Response.getProvider()).name());
89+
log.debug("provider.status : {}", member.getStatus().name());
9090

9191
member.updateEmail(oAuth2Response.getEmail());
9292

93-
return new CustomOAuth2User(member.getEmail(), member.getRole().name(), member.getPublicId());
93+
return new CustomOAuth2User(member.getEmail(), member.getRole().name(), member.getPublicId(), member.getStatus());
9494
} else {
95+
// 로컬 이메일 계정으로 존재하는 유저
9596
throw new PlayHiveException(ErrorCode.USER_ALREADY_EXISTS);
9697
}
9798
}
@@ -115,7 +116,7 @@ private OAuth2User createNewMember(OAuth2Response oAuth2Response, String provide
115116
.build();
116117

117118
memberJpaRepository.save(newMember);
118-
return new CustomOAuth2User(oAuth2Response.getEmail(), USER.name(), publicId);
119+
return new CustomOAuth2User(oAuth2Response.getEmail(), USER.name(), publicId, newMember.getStatus());
119120
}
120121

121122
/**

0 commit comments

Comments
 (0)