Skip to content

Commit 049df9f

Browse files
authored
Merge pull request #119 from OurMenu/KAN-51-fix/email
[FIX] 이메일 중복 허용
2 parents b45396e + 8a3b54c commit 049df9f

11 files changed

Lines changed: 125 additions & 67 deletions

File tree

src/main/java/com/ourmenu/backend/domain/user/application/CustomUserDetailsService.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,25 @@
11
package com.ourmenu.backend.domain.user.application;
22

33
import com.ourmenu.backend.domain.user.dao.UserRepository;
4+
import com.ourmenu.backend.domain.user.domain.SignInType;
45
import com.ourmenu.backend.domain.user.domain.User;
56
import com.ourmenu.backend.domain.user.domain.CustomUserDetails;
67
import com.ourmenu.backend.domain.user.exception.NotFoundUserException;
78
import lombok.RequiredArgsConstructor;
89
import lombok.extern.slf4j.Slf4j;
910
import org.springframework.security.core.userdetails.UserDetails;
10-
import org.springframework.security.core.userdetails.UserDetailsService;
1111
import org.springframework.security.core.userdetails.UsernameNotFoundException;
1212
import org.springframework.stereotype.Service;
1313

1414
@Service
1515
@RequiredArgsConstructor
1616
@Slf4j
17-
public class CustomUserDetailsService implements UserDetailsService {
17+
public class CustomUserDetailsService {
1818

1919
private final UserRepository userRepository;
2020

21-
@Override
22-
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
23-
24-
User user= userRepository.findByEmail(email).
21+
public UserDetails loadUserByEmailAndSignInType(String email, SignInType signInType) throws UsernameNotFoundException {
22+
User user= userRepository.findByEmailAndSignInType(email, signInType).
2523
orElseThrow(NotFoundUserException::new);
2624

2725
return new CustomUserDetails(

src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.ourmenu.backend.domain.user.dao.ConfirmCodeRepository;
44
import com.ourmenu.backend.domain.user.dao.UserRepository;
55
import com.ourmenu.backend.domain.user.domain.ConfirmCode;
6+
import com.ourmenu.backend.domain.user.domain.SignInType;
67
import com.ourmenu.backend.domain.user.domain.User;
78
import com.ourmenu.backend.domain.user.dto.request.PostEmailRequest;
89
import com.ourmenu.backend.domain.user.dto.response.EmailResponse;
@@ -84,7 +85,7 @@ public void verifyConfirmCode(VerifyEmailRequest request){
8485
public TemporaryPasswordResponse sendTemporaryPassword(PostEmailRequest request) {
8586
String email = request.getEmail();
8687
String temporaryPassword = generateRandomCode(8);
87-
User user = userRepository.findByEmail(email)
88+
User user = userRepository.findByEmailAndSignInType(email, SignInType.EMAIL)
8889
.orElseThrow(NotFoundUserException::new);
8990

9091
user.changePassword(passwordEncoder.encode(temporaryPassword));

src/main/java/com/ourmenu/backend/domain/user/application/UserService.java

Lines changed: 49 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,15 @@ public class UserService {
5555
*/
5656
@Transactional
5757
public TokenDto signUp(SignUpRequest request) {
58+
SignInType signInType = SignInType.convert(request.getSignInType());
59+
String email = request.getEmail();
60+
User savedUser;
5861

59-
User savedUser = saveUser(request);
62+
if (signInType.equals(SignInType.KAKAO)) {
63+
savedUser = signUpByKakao(email);
64+
} else {
65+
savedUser = signUpByEmail(email, request.getPassword());
66+
}
6067

6168
List<MealTime> mealTimes = mealTimeService.saveMealTimes(request.getMealTime(), savedUser.getId());
6269

@@ -65,8 +72,12 @@ public TokenDto signUp(SignUpRequest request) {
6572
throw new InvalidMealTimeCountException();
6673
}
6774

68-
TokenDto tokenDto = jwtTokenProvider.createAllToken(request.getEmail());
69-
RefreshToken refreshToken = new RefreshToken(tokenDto.getRefreshToken(), request.getEmail());
75+
TokenDto tokenDto = jwtTokenProvider.createAllToken(email, signInType);
76+
RefreshToken refreshToken = new RefreshToken(
77+
tokenDto.getRefreshToken(),
78+
email,
79+
signInType
80+
);
7081
refreshTokenRepository.save(refreshToken);
7182
return tokenDto;
7283
}
@@ -79,24 +90,34 @@ public TokenDto signUp(SignUpRequest request) {
7990
*/
8091
@Transactional
8192
public TokenDto signIn(SignInRequest request) {
82-
Optional<User> optionalUser = userRepository.findByEmail(request.getEmail());
83-
if (optionalUser.isEmpty() || !optionalUser.get().getSignInType().name().equals(request.getSignInType())) {
93+
String email = request.getEmail();
94+
SignInType signInType = SignInType.convert(request.getSignInType());
95+
96+
Optional<User> optionalUser = userRepository
97+
.findByEmailAndSignInType(email, signInType);
98+
99+
if (optionalUser.isEmpty() || !optionalUser.get().getSignInType().equals(signInType)) {
84100
throw new NotFoundUserException();
85101
}
86102

87103
User user = optionalUser.get();
88104

89-
if (request.getSignInType().equals("EMAIL") && !passwordEncoder.matches(request.getPassword(), user.getPassword())) {
105+
if (signInType.equals(SignInType.EMAIL) && !passwordEncoder.matches(request.getPassword(), user.getPassword())) {
90106
throw new NotMatchPasswordException();
91107
}
92108

93-
TokenDto tokenDto = jwtTokenProvider.createAllToken(request.getEmail());
94-
Optional<RefreshToken> refreshToken = refreshTokenRepository.findRefreshTokenByEmail(request.getEmail());
109+
TokenDto tokenDto = jwtTokenProvider.createAllToken(email, signInType);
110+
Optional<RefreshToken> refreshToken = refreshTokenRepository
111+
.findRefreshTokenByEmailAndSignInType(email, signInType);
95112

96113
if (refreshToken.isPresent()) {
97114
refreshTokenRepository.save(refreshToken.get().updateToken(tokenDto.getRefreshToken()));
98115
} else {
99-
RefreshToken newToken = new RefreshToken(tokenDto.getRefreshToken(), request.getEmail());
116+
RefreshToken newToken = new RefreshToken(
117+
tokenDto.getRefreshToken(),
118+
email,
119+
signInType
120+
);
100121
refreshTokenRepository.save(newToken);
101122
}
102123

@@ -158,6 +179,7 @@ public UserDto getUserInfo(CustomUserDetails userDetails) {
158179
public TokenDto reissueToken(ReissueRequest reissueRequest) {
159180
String refreshToken = reissueRequest.getRefreshToken();
160181
String email = jwtTokenProvider.getEmailFromToken(refreshToken);
182+
SignInType signInType = jwtTokenProvider.getSignInTypeFromToken(refreshToken);
161183

162184
if (email.isEmpty()) {
163185
throw new InvalidTokenException();
@@ -167,14 +189,14 @@ public TokenDto reissueToken(ReissueRequest reissueRequest) {
167189
throw new TokenExpiredExcpetion();
168190
}
169191

170-
RefreshToken storedToken = refreshTokenRepository.findRefreshTokenByEmail(email)
192+
RefreshToken storedToken = refreshTokenRepository.findRefreshTokenByEmailAndSignInType(email, signInType)
171193
.orElseThrow(NotMatchTokenException::new);
172194

173-
String newAccessToken = jwtTokenProvider.createToken(email, "Access");
195+
String newAccessToken = jwtTokenProvider.createToken(email, signInType, "Access");
174196
String newRefreshToken = reissueRequest.getRefreshToken();
175197

176198
if (jwtTokenProvider.validateToken(refreshToken)) {
177-
newRefreshToken = jwtTokenProvider.createToken(email, "Refresh");
199+
newRefreshToken = jwtTokenProvider.createToken(email, signInType, "Refresh");
178200
storedToken.updateToken(newRefreshToken);
179201
refreshTokenRepository.save(storedToken);
180202
}
@@ -198,8 +220,9 @@ public void signOut(HttpServletRequest request) {
198220
}
199221

200222
String email = jwtTokenProvider.getEmailFromToken(token);
223+
SignInType signInType = jwtTokenProvider.getSignInTypeFromToken(token);
201224

202-
refreshTokenRepository.findRefreshTokenByEmail(email)
225+
refreshTokenRepository.findRefreshTokenByEmailAndSignInType(email, signInType)
203226
.ifPresent(refreshTokenRepository::delete);
204227
}
205228

@@ -212,9 +235,9 @@ public void signOut(HttpServletRequest request) {
212235
public KakaoExistenceResponse validateKakaoUserExists(PostEmailRequest request) {
213236
String email = request.getEmail();
214237

215-
Optional<User> optionalUser = userRepository.findByEmail(email);
238+
Optional<User> optionalUser = userRepository.findByEmailAndSignInType(email, SignInType.KAKAO);
216239

217-
if (optionalUser.isPresent() && optionalUser.get().getSignInType() == SignInType.KAKAO) {
240+
if (optionalUser.isPresent() && optionalUser.get().getSignInType().equals(SignInType.KAKAO)) {
218241
return KakaoExistenceResponse.from(true);
219242
}
220243

@@ -231,45 +254,26 @@ public void removeUser(Long userId) {
231254
User user = userRepository.findById(userId)
232255
.orElseThrow(NotFoundUserException::new);
233256

234-
refreshTokenRepository.findRefreshTokenByEmail(user.getEmail())
257+
refreshTokenRepository.findRefreshTokenByEmailAndSignInType(user.getEmail(), user.getSignInType())
235258
.ifPresent(refreshTokenRepository::delete);
236259

237260
userRepository.delete(user);
238261
}
239262

240-
/**
241-
* 유저 정보를 저장한다.
242-
*
243-
* @param request
244-
* @return
245-
* @throws UnsupportedSignInTypeException 지원하지 않는 SignInType을 요청한 경우
246-
*/
247-
private User saveUser(SignUpRequest request) {
248-
if (request.getSignInType().equals("EMAIL")) {
249-
return signUpByEmail(request);
250-
}
251-
252-
if (request.getSignInType().equals("KAKAO")) {
253-
return signUpByKakao(request);
254-
}
255-
256-
throw new UnsupportedSignInTypeException();
257-
}
258-
259263
/**
260264
* Kakao 유저를 저장한다.
261265
*
262-
* @param request
266+
* @param email
263267
* @return
264268
*/
265-
private User signUpByKakao(SignUpRequest request) {
266-
Optional<User> optionalUser = userRepository.findByEmail(request.getEmail());
269+
private User signUpByKakao(String email) {
270+
Optional<User> optionalUser = userRepository.findByEmailAndSignInType(email, SignInType.KAKAO);
267271
if (optionalUser.isPresent() && optionalUser.get().getSignInType() == SignInType.KAKAO) {
268272
throw new DuplicateEmailException();
269273
}
270274

271275
User user = User.builder()
272-
.email(request.getEmail())
276+
.email(email)
273277
.signInType(SignInType.KAKAO)
274278
.build();
275279

@@ -279,19 +283,20 @@ private User signUpByKakao(SignUpRequest request) {
279283
/**
280284
* Email 유저를 저장한다.
281285
*
282-
* @param request
286+
* @param email
287+
* @param password
283288
* @return
284289
*/
285-
private User signUpByEmail(SignUpRequest request) {
286-
Optional<User> optionalUser = userRepository.findByEmail(request.getEmail());
290+
private User signUpByEmail(String email, String password) {
291+
Optional<User> optionalUser = userRepository.findByEmailAndSignInType(email, SignInType.EMAIL);
287292
if (optionalUser.isPresent() && optionalUser.get().getSignInType() == SignInType.EMAIL) {
288293
throw new DuplicateEmailException();
289294
}
290295

291-
String encodedPassword = passwordEncoder.encode(request.getPassword());
296+
String encodedPassword = passwordEncoder.encode(password);
292297

293298
User user = User.builder()
294-
.email(request.getEmail())
299+
.email(email)
295300
.password(encodedPassword)
296301
.signInType(SignInType.EMAIL)
297302
.build();
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package com.ourmenu.backend.domain.user.dao;
22

33
import com.ourmenu.backend.domain.user.domain.RefreshToken;
4+
import com.ourmenu.backend.domain.user.domain.SignInType;
45
import org.springframework.data.repository.CrudRepository;
56

67
import java.util.Optional;
78

89

910
public interface RefreshTokenRepository extends CrudRepository<RefreshToken, String> {
1011

11-
Optional<RefreshToken> findRefreshTokenByEmail(String email);
12+
Optional<RefreshToken> findRefreshTokenByEmailAndSignInType(String email, SignInType signInType);
1213

1314
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package com.ourmenu.backend.domain.user.dao;
22

3+
import com.ourmenu.backend.domain.user.domain.SignInType;
34
import com.ourmenu.backend.domain.user.domain.User;
45
import org.springframework.data.jpa.repository.JpaRepository;
56

67
import java.util.Optional;
78

89
public interface UserRepository extends JpaRepository<User, Long> {
9-
Optional<User> findByEmail(String email);
10+
Optional<User> findByEmailAndSignInType(String email, SignInType signInType);
1011
}

src/main/java/com/ourmenu/backend/domain/user/domain/RefreshToken.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,13 @@ public class RefreshToken {
1919
@Indexed
2020
private String email;
2121

22-
public RefreshToken(String token, String email) {
22+
@Indexed
23+
private SignInType signInType;
24+
25+
public RefreshToken(String token, String email, SignInType signInType) {
2326
this.refreshToken = token;
2427
this.email = email;
28+
this.signInType = signInType;
2529
}
2630

2731
public RefreshToken updateToken(String token) {
Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
package com.ourmenu.backend.domain.user.domain;
22

3+
import com.ourmenu.backend.domain.user.exception.UnsupportedSignInTypeException;
4+
35
public enum SignInType {
4-
EMAIL, KAKAO
6+
EMAIL, KAKAO;
7+
8+
public static SignInType convert(String signInType) {
9+
try {
10+
return SignInType.valueOf(signInType);
11+
} catch (IllegalArgumentException e) {
12+
throw new UnsupportedSignInTypeException();
13+
}
14+
}
515
}

src/main/java/com/ourmenu/backend/domain/user/dto/response/ReissueRequest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
import jakarta.validation.constraints.NotBlank;
44
import lombok.AllArgsConstructor;
55
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
67

78
@Getter
9+
@NoArgsConstructor
810
@AllArgsConstructor
911
public class ReissueRequest {
1012

src/main/java/com/ourmenu/backend/global/filter/JwtAuthenticationFilter.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.ourmenu.backend.global.filter;
22

33

4+
import com.ourmenu.backend.domain.user.domain.SignInType;
45
import com.ourmenu.backend.global.util.JwtTokenProvider;
56
import jakarta.servlet.FilterChain;
67
import jakarta.servlet.ServletException;
@@ -27,25 +28,29 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
2728
String refreshToken = jwtTokenProvider.getHeaderToken(request, "Refresh_token");
2829

2930
if(accessToken != null && jwtTokenProvider.validateToken(accessToken)) {
30-
setAuthentication(jwtTokenProvider.getEmailFromToken(accessToken));
31+
setAuthentication(
32+
jwtTokenProvider.getEmailFromToken(accessToken),
33+
jwtTokenProvider.getSignInTypeFromToken(accessToken)
34+
);
3135
filterChain.doFilter(request,response);
3236
return;
3337
}
3438

3539
if (refreshToken != null && jwtTokenProvider.refreshTokenValidation(refreshToken)) {
3640
String email = jwtTokenProvider.getEmailFromToken(refreshToken);
37-
String newAccessToken = jwtTokenProvider.createToken(email, "Access");
41+
SignInType signInType = jwtTokenProvider.getSignInTypeFromToken(refreshToken);
42+
String newAccessToken = jwtTokenProvider.createToken(email, signInType, "Access");
3843
jwtTokenProvider.setHeaderAccessToken(response, newAccessToken);
39-
setAuthentication(jwtTokenProvider.getEmailFromToken(newAccessToken));
44+
setAuthentication(jwtTokenProvider.getEmailFromToken(newAccessToken), signInType);
4045
filterChain.doFilter(request,response);
4146
return;
4247
}
4348

4449
filterChain.doFilter(request,response);
4550
}
4651

47-
public void setAuthentication(String email) {
48-
Authentication authentication = jwtTokenProvider.createAuthentication(email);
52+
public void setAuthentication(String email, SignInType signInType) {
53+
Authentication authentication = jwtTokenProvider.createAuthentication(email, signInType);
4954
SecurityContextHolder.getContext().setAuthentication(authentication);
5055
}
5156

0 commit comments

Comments
 (0)