From 169d914035d5e88b90e0669dc566c212e8680797 Mon Sep 17 00:00:00 2001 From: koungq Date: Sun, 7 Jul 2024 11:58:07 +0900 Subject: [PATCH 1/3] Refactor: Username -> Email --- .../jwt/filter/JwtAuthenticationProcessingFilter.java | 8 ++++---- .../weeth/global/auth/jwt/service/JwtService.java | 10 +++++----- ...CustomJsonUsernamePasswordAuthenticationFilter.java | 6 +++--- .../global/auth/login/handler/LoginSuccessHandler.java | 10 +++++----- .../weeth/global/auth/login/service/LoginService.java | 6 +++--- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/main/java/leets/weeth/global/auth/jwt/filter/JwtAuthenticationProcessingFilter.java b/src/main/java/leets/weeth/global/auth/jwt/filter/JwtAuthenticationProcessingFilter.java index f5392f8d..04db9da8 100644 --- a/src/main/java/leets/weeth/global/auth/jwt/filter/JwtAuthenticationProcessingFilter.java +++ b/src/main/java/leets/weeth/global/auth/jwt/filter/JwtAuthenticationProcessingFilter.java @@ -53,7 +53,7 @@ public void checkRefreshTokenAndReIssueAccessToken(HttpServletResponse response, userRepository.findByRefreshToken(refreshToken) .ifPresent(user -> { String reIssuedRefreshToken = reIssueRefreshToken(user); - String accessToken = jwtService.createAccessToken(user.getId(), user.getUsername()); + String accessToken = jwtService.createAccessToken(user.getId(), user.getEmail()); jwtService.sendAccessAndRefreshToken(response, accessToken, reIssuedRefreshToken); jwtService.sendAccessToken(response, accessToken); }); @@ -71,8 +71,8 @@ public void checkAccessTokenAndAuthentication(HttpServletRequest request, HttpSe log.info("checkAccessTokenAndAuthentication() 호출"); jwtService.extractAccessToken(request) .filter(jwtService::isTokenValid) - .ifPresent(accessToken -> jwtService.extractUsername(accessToken) - .ifPresent(username -> userRepository.findByUsername(username) + .ifPresent(accessToken -> jwtService.extractEmail(accessToken) + .ifPresent(email -> userRepository.findByEmail(email) .ifPresent(this::saveAuthentication))); filterChain.doFilter(request, response); @@ -82,7 +82,7 @@ public void saveAuthentication(User myUser) { String password = myUser.getPassword(); UserDetails userDetailsUser = org.springframework.security.core.userdetails.User.builder() - .username(myUser.getUsername()) + .username(myUser.getEmail()) .password(password) .roles(myUser.getRole().name()) .build(); diff --git a/src/main/java/leets/weeth/global/auth/jwt/service/JwtService.java b/src/main/java/leets/weeth/global/auth/jwt/service/JwtService.java index 5ce2879b..be233c2e 100644 --- a/src/main/java/leets/weeth/global/auth/jwt/service/JwtService.java +++ b/src/main/java/leets/weeth/global/auth/jwt/service/JwtService.java @@ -37,19 +37,19 @@ public class JwtService { private static final String ACCESS_TOKEN_SUBJECT = "AccessToken"; private static final String REFRESH_TOKEN_SUBJECT = "RefreshToken"; - private static final String USERNAME_CLAIM = "username"; + private static final String EMAIL_CLAIM = "email"; private static final String ID_CLAIM = "id"; private static final String BEARER = "Bearer "; private final UserRepository userRepository; - public String createAccessToken(Long id, String username) { + public String createAccessToken(Long id, String email) { Date now = new Date(); return JWT.create() .withSubject(ACCESS_TOKEN_SUBJECT) .withExpiresAt(new Date(now.getTime() + accessTokenExpirationPeriod)) .withClaim(ID_CLAIM, id) - .withClaim(USERNAME_CLAIM, username) + .withClaim(EMAIL_CLAIM, email) .sign(Algorithm.HMAC512(key)); } @@ -88,12 +88,12 @@ public Optional extractAccessToken(HttpServletRequest request) { .map(refreshToken -> refreshToken.replace(BEARER, "")); } - public Optional extractUsername(String accessToken) { + public Optional extractEmail(String accessToken) { try { return Optional.ofNullable(JWT.require(Algorithm.HMAC512(key)) .build() .verify(accessToken) - .getClaim(USERNAME_CLAIM) + .getClaim(EMAIL_CLAIM) .asString()); } catch (Exception e) { log.error("액세스 토큰이 유효하지 않습니다."); diff --git a/src/main/java/leets/weeth/global/auth/login/filter/CustomJsonUsernamePasswordAuthenticationFilter.java b/src/main/java/leets/weeth/global/auth/login/filter/CustomJsonUsernamePasswordAuthenticationFilter.java index 6db6a7a6..9c82ce5e 100644 --- a/src/main/java/leets/weeth/global/auth/login/filter/CustomJsonUsernamePasswordAuthenticationFilter.java +++ b/src/main/java/leets/weeth/global/auth/login/filter/CustomJsonUsernamePasswordAuthenticationFilter.java @@ -20,7 +20,7 @@ public class CustomJsonUsernamePasswordAuthenticationFilter extends AbstractAuth private static final String DEFAULT_LOGIN_REQUEST_URL = "/login"; private static final String HTTP_METHOD = "POST"; private static final String CONTENT_TYPE = "application/json"; - private static final String USERNAME_KEY = "username"; + private static final String EMAIL_KEY = "email"; private static final String PASSWORD_KEY = "password"; private static final AntPathRequestMatcher DEFAULT_LOGIN_PATH_REQUEST_MATCHER = new AntPathRequestMatcher(DEFAULT_LOGIN_REQUEST_URL, HTTP_METHOD); @@ -42,10 +42,10 @@ public Authentication attemptAuthentication(HttpServletRequest request, HttpServ Map usernamePasswordMap = objectMapper.readValue(messageBody, Map.class); - String username = usernamePasswordMap.get(USERNAME_KEY); + String email = usernamePasswordMap.get(EMAIL_KEY); String password = usernamePasswordMap.get(PASSWORD_KEY); - UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password); + UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(email, password); return this.getAuthenticationManager().authenticate(authRequest); } diff --git a/src/main/java/leets/weeth/global/auth/login/handler/LoginSuccessHandler.java b/src/main/java/leets/weeth/global/auth/login/handler/LoginSuccessHandler.java index 1dc7aa82..2512b809 100644 --- a/src/main/java/leets/weeth/global/auth/login/handler/LoginSuccessHandler.java +++ b/src/main/java/leets/weeth/global/auth/login/handler/LoginSuccessHandler.java @@ -27,10 +27,10 @@ public class LoginSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) { - String username = extractUsername(authentication); // 인증 정보에서 Username(username) 추출 - Optional optionalUser = userRepository.findByUsername(username); + String email = extractEmail(authentication); // 인증 정보에서 email 추출 + Optional optionalUser = userRepository.findByEmail(email); - String accessToken = jwtService.createAccessToken(optionalUser.get().getId(), username); // JwtService의 createAccessToken을 사용하여 AccessToken 발급 + String accessToken = jwtService.createAccessToken(optionalUser.get().getId(), email); // JwtService의 createAccessToken을 사용하여 AccessToken 발급 String refreshToken = jwtService.createRefreshToken(); // JwtService의 createRefreshToken을 사용하여 RefreshToken 발급 jwtService.sendAccessAndRefreshToken(response, accessToken, refreshToken); // 응답 헤더에 AccessToken, RefreshToken 실어서 응답 @@ -41,12 +41,12 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo userRepository.saveAndFlush(user); }); - log.info("로그인에 성공하였습니다. 아이디 : {}", username); + log.info("로그인에 성공하였습니다. 아이디 : {}", email); log.info("로그인에 성공하였습니다. AccessToken : {}", accessToken); log.info("발급된 AccessToken 만료 기간 : {}", accessTokenExpiration); } - private String extractUsername(Authentication authentication) { + private String extractEmail(Authentication authentication) { UserDetails userDetails = (UserDetails) authentication.getPrincipal(); return userDetails.getUsername(); } diff --git a/src/main/java/leets/weeth/global/auth/login/service/LoginService.java b/src/main/java/leets/weeth/global/auth/login/service/LoginService.java index d1643234..60de9be4 100644 --- a/src/main/java/leets/weeth/global/auth/login/service/LoginService.java +++ b/src/main/java/leets/weeth/global/auth/login/service/LoginService.java @@ -15,12 +15,12 @@ public class LoginService implements UserDetailsService { private final UserRepository userRepository; @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - User user = userRepository.findByUsername(username) + public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { + User user = userRepository.findByEmail(email) .orElseThrow(() -> new UsernameNotFoundException("해당 이메일이 존재하지 않습니다.")); return org.springframework.security.core.userdetails.User.builder() - .username(user.getUsername()) + .username(user.getEmail()) .password(user.getPassword()) .roles(user.getRole().name()) .build(); From 645321292feb61f0ea35ab2f07b9866421db96f4 Mon Sep 17 00:00:00 2001 From: koungq Date: Sun, 7 Jul 2024 11:58:28 +0900 Subject: [PATCH 2/3] Refactor: Username -> Email --- src/main/java/leets/weeth/domain/user/dto/UserDTO.java | 2 +- .../java/leets/weeth/domain/user/repository/UserRepository.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/leets/weeth/domain/user/dto/UserDTO.java b/src/main/java/leets/weeth/domain/user/dto/UserDTO.java index ed81f499..6f40d559 100644 --- a/src/main/java/leets/weeth/domain/user/dto/UserDTO.java +++ b/src/main/java/leets/weeth/domain/user/dto/UserDTO.java @@ -10,7 +10,7 @@ public class UserDTO { @NoArgsConstructor @AllArgsConstructor public static class SignUp { - private String username; + private String email; private String password; } } diff --git a/src/main/java/leets/weeth/domain/user/repository/UserRepository.java b/src/main/java/leets/weeth/domain/user/repository/UserRepository.java index 64b6b2df..ebcf5ace 100644 --- a/src/main/java/leets/weeth/domain/user/repository/UserRepository.java +++ b/src/main/java/leets/weeth/domain/user/repository/UserRepository.java @@ -7,7 +7,7 @@ public interface UserRepository extends JpaRepository { - Optional findByUsername(String username); + Optional findByEmail(String email); Optional findByRefreshToken(String refreshToken); } From 6e9300d47bca29d0387c76ad8b4e450eaad134f2 Mon Sep 17 00:00:00 2001 From: koungq Date: Sun, 7 Jul 2024 11:58:55 +0900 Subject: [PATCH 3/3] =?UTF-8?q?Feat:=20=ED=9A=8C=EC=9B=90=20=ED=83=88?= =?UTF-8?q?=ED=87=B4=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/controller/UserController.java | 15 ++++++++++----- .../java/leets/weeth/domain/user/entity/User.java | 10 +++++++++- .../weeth/domain/user/entity/enums/Status.java | 8 ++++++++ .../weeth/domain/user/service/UserService.java | 13 ++++++++++--- 4 files changed, 37 insertions(+), 9 deletions(-) create mode 100644 src/main/java/leets/weeth/domain/user/entity/enums/Status.java diff --git a/src/main/java/leets/weeth/domain/user/controller/UserController.java b/src/main/java/leets/weeth/domain/user/controller/UserController.java index 29aa9ef3..9e3ef17b 100644 --- a/src/main/java/leets/weeth/domain/user/controller/UserController.java +++ b/src/main/java/leets/weeth/domain/user/controller/UserController.java @@ -5,10 +5,9 @@ import leets.weeth.domain.user.service.UserService; import leets.weeth.global.common.response.CommonResponse; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.core.userdetails.User; +import org.springframework.web.bind.annotation.*; @RestController @RequiredArgsConstructor @@ -18,8 +17,14 @@ public class UserController { private final UserService userService; @PostMapping("/sign-up") - public CommonResponse signUp(@RequestBody @Valid UserDTO.SignUp requestDto) throws Exception { + public CommonResponse signUp(@RequestBody @Valid UserDTO.SignUp requestDto) { userService.signUp(requestDto); return CommonResponse.createSuccess(); } + + @DeleteMapping("") + public CommonResponse delete(@AuthenticationPrincipal User user) { + userService.delete(user.getUsername()); + return CommonResponse.createSuccess(); + } } diff --git a/src/main/java/leets/weeth/domain/user/entity/User.java b/src/main/java/leets/weeth/domain/user/entity/User.java index 43a77778..f063ad04 100644 --- a/src/main/java/leets/weeth/domain/user/entity/User.java +++ b/src/main/java/leets/weeth/domain/user/entity/User.java @@ -2,6 +2,7 @@ import jakarta.persistence.*; import leets.weeth.domain.user.entity.enums.Role; +import leets.weeth.domain.user.entity.enums.Status; import leets.weeth.global.common.entity.BaseEntity; import lombok.*; @@ -18,7 +19,7 @@ public class User extends BaseEntity { @Column(name = "user_id") private Long id; - private String username; + private String email; private String password; @@ -27,7 +28,14 @@ public class User extends BaseEntity { private String refreshToken; + @Enumerated(EnumType.STRING) + private Status status; + public void updateRefreshToken(String updatedToken) { this.refreshToken = updatedToken; } + + public void leave() { + this.status = Status.LEFT; + } } diff --git a/src/main/java/leets/weeth/domain/user/entity/enums/Status.java b/src/main/java/leets/weeth/domain/user/entity/enums/Status.java new file mode 100644 index 00000000..e2f1b195 --- /dev/null +++ b/src/main/java/leets/weeth/domain/user/entity/enums/Status.java @@ -0,0 +1,8 @@ +package leets.weeth.domain.user.entity.enums; + +public enum Status { + + ACTIVE, + BANNED, + LEFT +} diff --git a/src/main/java/leets/weeth/domain/user/service/UserService.java b/src/main/java/leets/weeth/domain/user/service/UserService.java index 2ed36488..e5ff740a 100644 --- a/src/main/java/leets/weeth/domain/user/service/UserService.java +++ b/src/main/java/leets/weeth/domain/user/service/UserService.java @@ -8,6 +8,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor @@ -16,18 +17,24 @@ public class UserService { private final UserRepository userRepository; private final PasswordEncoder passwordEncoder; - public void signUp(UserDTO.SignUp requestDto) throws Exception { - if (userRepository.findByUsername(requestDto.getUsername()).isPresent()) + public void signUp(UserDTO.SignUp requestDto) { + if (userRepository.findByEmail(requestDto.getEmail()).isPresent()) throw new EntityExistsException("이미 존재하는 아이디입니다."); // 수정: 아이디 이외 중복 처리 User user = User.builder() - .username(requestDto.getUsername()) + .email(requestDto.getEmail()) .password(passwordEncoder.encode(requestDto.getPassword())) .role(Role.USER) .build(); userRepository.save(user); } + + @Transactional + public void delete(String email) { + userRepository.findByEmail(email) + .ifPresent(User::leave); + } }