Skip to content

Commit

Permalink
Feat: 회원 수정 리팩터링 #83
Browse files Browse the repository at this point in the history
  • Loading branch information
Irisation23 committed Aug 29, 2022
1 parent 75eb84b commit a8dfb4b
Show file tree
Hide file tree
Showing 7 changed files with 65 additions and 29 deletions.
11 changes: 6 additions & 5 deletions src/main/java/com/nhnacademy/marketgg/auth/aop/TokenAspect.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.nhnacademy.marketgg.auth.jwt.TokenUtils;
import java.lang.reflect.Parameter;
import java.util.Objects;
import javax.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
Expand Down Expand Up @@ -40,14 +41,14 @@ public class TokenAspect {
@Around("execution(* com.nhnacademy.marketgg.auth.controller.*.*(.., @com.nhnacademy.marketgg.auth.annotation.Token (*), ..))")
public Object parseToken(ProceedingJoinPoint pjp) throws Throwable {
log.info("Method: {}", pjp.getSignature().getName());

ServletRequestAttributes requestAttributes
= Objects.requireNonNull((ServletRequestAttributes) RequestContextHolder.getRequestAttributes());
= (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();

String token = requestAttributes.getRequest().getHeader(HttpHeaders.AUTHORIZATION);
String token = request.getHeader(HttpHeaders.AUTHORIZATION);

if (Objects.isNull(token)
|| !token.startsWith(TokenUtils.BEARER)
|| tokenUtils.isInvalidToken(token)) {
if (Objects.isNull(token) || !token.startsWith(TokenUtils.BEARER) || !token.startsWith(TokenUtils.BEARER)) {

throw new IllegalArgumentException();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@
import static org.springframework.http.MediaType.APPLICATION_JSON;

import com.nhnacademy.marketgg.auth.annotation.Token;
import com.nhnacademy.marketgg.auth.dto.request.MemberUpdateRequest;
import com.nhnacademy.marketgg.auth.dto.request.MemberInfoRequest;
import com.nhnacademy.marketgg.auth.dto.request.MemberUpdateRequest;
import com.nhnacademy.marketgg.auth.dto.response.MemberInfoResponse;
import com.nhnacademy.marketgg.auth.dto.response.MemberNameResponse;
import com.nhnacademy.marketgg.auth.dto.response.MemberResponse;
import com.nhnacademy.marketgg.auth.dto.response.login.oauth.TokenResponse;
import com.nhnacademy.marketgg.auth.dto.response.UuidTokenResponse;
import com.nhnacademy.marketgg.auth.dto.response.common.AuthResult;
import com.nhnacademy.marketgg.auth.exception.UnAuthorizationException;
import com.nhnacademy.marketgg.auth.jwt.TokenUtils;
Expand Down Expand Up @@ -47,16 +47,17 @@ public class AuthInfoController {
/**
* 회원정보 수정을 위한 컨트롤러 메서드 입니다.
*
* @param token - JWT
* @param token - JWT
* @param memberUpdateRequest - 수정할 회원 정보를 담고있는 객체 입니다.
* @return - 상태코드를 리턴합니다.
* @author 김훈민
*/
@PutMapping
public ResponseEntity<AuthResult<String>> update(@Token String token,
@Valid @RequestBody final MemberUpdateRequest memberUpdateRequest) {
public ResponseEntity<AuthResult<UuidTokenResponse>> update(@Token String token,
@Valid @RequestBody
final MemberUpdateRequest memberUpdateRequest) {

TokenResponse update = authInfoService.update(token, memberUpdateRequest);
UuidTokenResponse update = authInfoService.update(token, memberUpdateRequest);

authService.logout(token);

Expand All @@ -66,7 +67,7 @@ public ResponseEntity<AuthResult<String>> update(@Token String token,

return ResponseEntity.status(OK)
.headers(httpHeaders)
.body(AuthResult.success("Update Success"));
.body(AuthResult.success(update));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import javax.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.password.PasswordEncoder;

@RequiredArgsConstructor
@Getter
Expand All @@ -15,4 +16,8 @@ public class MemberUpdateRequest {
@NotBlank
private String phoneNumber;

public void encodingPassword(PasswordEncoder passwordEncoder) {
this.password = passwordEncoder.encode(this.password);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.nhnacademy.marketgg.auth.dto.response;

import com.nhnacademy.marketgg.auth.dto.response.login.oauth.TokenResponse;
import java.time.LocalDateTime;
import lombok.Getter;

@Getter
public class UuidTokenResponse {

private final String jwt;
private final LocalDateTime expiredDate;
private String updatedUuid;

public UuidTokenResponse(TokenResponse tokenResponse, String updatedUuid) {
this.jwt = tokenResponse.getJwt();
this.expiredDate = tokenResponse.getExpiredDate();
this.updatedUuid = updatedUuid;
}

}
23 changes: 14 additions & 9 deletions src/main/java/com/nhnacademy/marketgg/auth/entity/Auth.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
* 회원의 정보를 저장합니다.
Expand Down Expand Up @@ -91,8 +92,8 @@ public Auth(final SignUpRequest signUpRequest) {
this.phoneNumber = signUpRequest.getPhoneNumber();
this.passwordUpdatedAt = LocalDate.now();
this.provider =
checkProvider(signUpRequest.getProvider()) ? Provider.valueOf(signUpRequest.getProvider()) :
Provider.SELF;
checkProvider(signUpRequest.getProvider()) ? Provider.valueOf(signUpRequest.getProvider()) :
Provider.SELF;
this.createdAt = LocalDateTime.now();
}

Expand All @@ -109,13 +110,17 @@ private boolean checkProvider(String provider) {
* 인증 갱신과 관련된 요청을 받아 인증 정보를 갱신하는 메서드입니다.
*
* @param memberUpdateRequest - 인증 정보 갱신 요청 객체
* @param passwordEncoder
*/
public void updateAuth(final MemberUpdateRequest memberUpdateRequest) {
this.uuid = UUID.randomUUID().toString();
public String updateAuth(final MemberUpdateRequest memberUpdateRequest, PasswordEncoder passwordEncoder) {
String updatedUuid = UUID.randomUUID().toString();
this.uuid = updatedUuid;
this.password = memberUpdateRequest.getPassword();
this.name = memberUpdateRequest.getName();
this.phoneNumber = memberUpdateRequest.getPhoneNumber();
this.passwordUpdatedAt = getUpdateDate(memberUpdateRequest.getPassword());
this.passwordUpdatedAt = getUpdateDate(memberUpdateRequest.getPassword(), passwordEncoder);

return updatedUuid;
}

public void deleteAuth(final LocalDateTime withdrawAt) {
Expand All @@ -128,8 +133,8 @@ public void deleteAuth(final LocalDateTime withdrawAt) {
* @param updatedPassword - 수정된 비밀번호 입니다.
* @return LocalDate - 비밀번호가 수정된 날짜를 기점으로 갱신합니다.
*/
private LocalDate getUpdateDate(final String updatedPassword) {
if (isUpdatePassword(updatedPassword)) {
private LocalDate getUpdateDate(final String updatedPassword, PasswordEncoder passwordEncoder) {
if (isUpdatePassword(updatedPassword, passwordEncoder)) {
return this.passwordUpdatedAt;
}

Expand All @@ -142,8 +147,8 @@ private LocalDate getUpdateDate(final String updatedPassword) {
* @param updatedPassword - 수정된 비밀번호 입니다.
* @return boolean - Null 이 아니고, 기존 비밀번호랑 같으면 false 를 반환.
*/
private boolean isUpdatePassword(final String updatedPassword) {
return Objects.isNull(updatedPassword) || Objects.equals(this.password, updatedPassword);
private boolean isUpdatePassword(final String updatedPassword, PasswordEncoder passwordEncoder) {
return Objects.isNull(updatedPassword) || passwordEncoder.matches(this.password, updatedPassword);
}

public void updateUuid(final String uuid) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import com.nhnacademy.marketgg.auth.dto.response.MemberInfoResponse;
import com.nhnacademy.marketgg.auth.dto.response.MemberNameResponse;
import com.nhnacademy.marketgg.auth.dto.response.MemberResponse;
import com.nhnacademy.marketgg.auth.dto.response.login.oauth.TokenResponse;
import com.nhnacademy.marketgg.auth.dto.response.UuidTokenResponse;
import com.nhnacademy.marketgg.auth.exception.UnAuthorizationException;
import java.time.LocalDateTime;
import java.util.List;
Expand Down Expand Up @@ -53,7 +53,7 @@ public interface AuthInfoService {
* @return - 새로운 JWT
* @author 김훈민
*/
TokenResponse update(final String token, final MemberUpdateRequest memberUpdateRequest);
UuidTokenResponse update(final String token, final MemberUpdateRequest memberUpdateRequest);

/**
* 회원탈퇴합니다.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import com.nhnacademy.marketgg.auth.dto.response.MemberInfoResponse;
import com.nhnacademy.marketgg.auth.dto.response.MemberNameResponse;
import com.nhnacademy.marketgg.auth.dto.response.MemberResponse;
import com.nhnacademy.marketgg.auth.dto.response.login.oauth.TokenResponse;
import com.nhnacademy.marketgg.auth.dto.response.UuidTokenResponse;
import com.nhnacademy.marketgg.auth.entity.Auth;
import com.nhnacademy.marketgg.auth.exception.AuthNotFoundException;
import com.nhnacademy.marketgg.auth.jwt.TokenUtils;
Expand All @@ -18,6 +18,7 @@
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -34,6 +35,8 @@ public class DefaultAuthInfoService implements AuthInfoService {
private final RoleRepository roleRepository;
private final RedisTemplate<String, Object> redisTemplate;

private final PasswordEncoder passwordEncoder;

/**
* {@inheritDoc}
*
Expand Down Expand Up @@ -74,14 +77,15 @@ public List<MemberNameResponse> findMemberNameList(List<String> uuids) {
*/
@Transactional
@Override
public TokenResponse update(final String token, final MemberUpdateRequest memberUpdateRequest) {
public UuidTokenResponse update(final String token, final MemberUpdateRequest memberUpdateRequest) {
String uuid = tokenUtils.getUuidFromToken(token);
Auth updatedAuth = authRepository.findByUuid(uuid)
.orElseThrow(AuthNotFoundException::new);
memberUpdateRequest.encodingPassword(passwordEncoder);

updatedAuth.updateAuth(memberUpdateRequest);
String updatedUuid = updatedAuth.updateAuth(memberUpdateRequest, passwordEncoder);
redisTemplate.opsForHash()
.delete(updatedAuth.getUuid(), TokenUtils.REFRESH_TOKEN);
.delete(uuid, TokenUtils.REFRESH_TOKEN);
List<SimpleGrantedAuthority> roles = roleRepository.findRolesByAuthId(updatedAuth.getId())
.stream()
.map(r -> new SimpleGrantedAuthority(
Expand All @@ -90,9 +94,9 @@ public TokenResponse update(final String token, final MemberUpdateRequest member
Collectors.toUnmodifiableList());

UsernamePasswordAuthenticationToken auth =
new UsernamePasswordAuthenticationToken(updatedAuth.getUuid(), "", roles);
new UsernamePasswordAuthenticationToken(updatedUuid, "", roles);

return tokenUtils.saveRefreshToken(redisTemplate, auth);
return new UuidTokenResponse(tokenUtils.saveRefreshToken(redisTemplate, auth), updatedUuid);
}

/**
Expand Down

0 comments on commit a8dfb4b

Please sign in to comment.