Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,22 @@
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import org.store.clothstar.member.domain.Account;
import org.store.clothstar.member.domain.CustomUserDetails;
import org.store.clothstar.member.domain.Member;
import org.store.clothstar.member.repository.MemberRepository;
import org.store.clothstar.member.repository.AccountRepository;

@Service
@Slf4j
@RequiredArgsConstructor
public class CustomUserDetailsService implements UserDetailsService {
private final MemberRepository memberRepository;
private final AccountRepository accountRepository;

@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
log.info("loadUserByUsername() 실행");
Member member = memberRepository.findByEmail(email)
Account account = accountRepository.findByEmail(email)
.orElseThrow(() -> new UsernameNotFoundException("해당 아이디를 찾을 수 없습니다."));

return new CustomUserDetails(member);
return new CustomUserDetails(account);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,10 @@
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import org.store.clothstar.common.error.ErrorCode;
import org.store.clothstar.common.error.exception.NotFoundMemberException;
import org.store.clothstar.member.domain.Account;
import org.store.clothstar.member.domain.CustomUserDetails;
import org.store.clothstar.member.domain.Member;
import org.store.clothstar.member.repository.MemberRepository;
import org.store.clothstar.member.repository.AccountRepository;
import org.store.clothstar.member.repository.AuthorizationRepository;

import java.io.IOException;

Expand All @@ -23,7 +22,8 @@
@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {
private final JwtUtil jwtUtil;
private final MemberRepository memberRepository;
private final AccountRepository accountRepository;
private final AuthorizationRepository authorizationRepository;

/**
* 요청이 왔을때 token이 있는지 확인하고 token에 대한 유효성 검사를 진행한다.
Expand All @@ -50,10 +50,12 @@ private void authenticateUserWithToken(String token) {
Long memberId = jwtUtil.getMemberId(token);
log.info("refresh 토큰 memberId: {}", memberId);

Member member = memberRepository.findById(memberId)
.orElseThrow(() -> new NotFoundMemberException(ErrorCode.NOT_FOUND_MEMBER));
Account account = accountRepository.findById(memberId)
.orElseThrow(() -> new IllegalArgumentException("계정정보를 찾을수 없습니다."));

CustomUserDetails customUserDetails = new CustomUserDetails(member);
log.error("account toString : {}", account.toString());

CustomUserDetails customUserDetails = new CustomUserDetails(account);

UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(
customUserDetails, null, customUserDetails.getAuthorities());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
import org.springframework.stereotype.Service;
import org.store.clothstar.common.error.ErrorCode;
import org.store.clothstar.common.error.exception.NotFoundMemberException;
import org.store.clothstar.member.domain.Member;
import org.store.clothstar.member.domain.Account;
import org.store.clothstar.member.repository.AccountRepository;
import org.store.clothstar.member.repository.MemberRepository;

import java.util.Arrays;
Expand All @@ -18,6 +19,7 @@
public class JwtService {
private final JwtUtil jwtUtil;
private final MemberRepository memberRepository;
private final AccountRepository accountRepository;

public String getRefreshToken(HttpServletRequest request) {
if (request.getCookies() == null) {
Expand All @@ -33,9 +35,9 @@ public String getRefreshToken(HttpServletRequest request) {

public String getAccessTokenByRefreshToken(String refreshToken) {
Long memberId = jwtUtil.getMemberId(refreshToken);
Member member = memberRepository.findById(memberId)
Account account = accountRepository.findById(memberId)
.orElseThrow(() -> new NotFoundMemberException(ErrorCode.NOT_FOUND_MEMBER));

return jwtUtil.createAccessToken(member);
return jwtUtil.createAccessToken(account);
}
}
18 changes: 8 additions & 10 deletions src/main/java/org/store/clothstar/common/config/jwt/JwtUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.store.clothstar.member.domain.Member;
import org.store.clothstar.member.domain.Account;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
Expand Down Expand Up @@ -46,17 +46,16 @@ public Cookie createCookie(String key, String value) {
return cookie;
}

public String createAccessToken(Member member) {
return createToken(member, jwtProperties.getAccessTokenValidTimeMillis(), ACCESS_TOKEN);
public String createAccessToken(Account account) {
return createToken(account, jwtProperties.getAccessTokenValidTimeMillis(), ACCESS_TOKEN);
}

public String createRefreshToken(Member member) {
return createToken(member, jwtProperties.getRefreshTokenValidTimeMillis(), REFRESH_TOKEN);
public String createRefreshToken(Account account) {
return createToken(account, jwtProperties.getRefreshTokenValidTimeMillis(), REFRESH_TOKEN);
}

private String createToken(Member member, Long tokenValidTimeMillis, String tokenType) {
Long memberId = member.getMemberId();
String memberEmail = member.getEmail();
private String createToken(Account account, Long tokenValidTimeMillis, String tokenType) {
Long memberId = account.getAccountId();
Date currentDate = new Date();
Date expireDate = new Date(currentDate.getTime() + tokenValidTimeMillis);

Expand All @@ -69,9 +68,8 @@ private String createToken(Member member, Long tokenValidTimeMillis, String toke
.issuedAt(currentDate)
.expiration(expireDate)
.claim("tokenType", tokenType)
.claim("email", memberEmail)
.claim("id", memberId)
.claim("role", member.getRole())
.claim("role", account.getAuthorizations())
.signWith(secretKey)
.compact();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.store.clothstar.common.dto.MessageDTO;
import org.store.clothstar.common.util.MessageDTOBuilder;
import org.store.clothstar.member.domain.Account;
import org.store.clothstar.member.domain.CustomUserDetails;
import org.store.clothstar.member.domain.Member;
import org.store.clothstar.member.dto.request.MemberLoginRequest;

import java.io.IOException;
Expand Down Expand Up @@ -71,12 +71,14 @@ protected void successfulAuthentication(HttpServletRequest request, HttpServletR
Authentication authentication) throws IOException, ServletException {
log.info("로그인 성공");
CustomUserDetails customUserDetails = (CustomUserDetails) authentication.getPrincipal();
Member member = customUserDetails.getMember();
log.info("member: {}", member.toString());

String accessToken = jwtUtil.createAccessToken(member);
// Member member = customUserDetails.getMember();
Account account = customUserDetails.getAccount();
log.info("account: {}", account.toString());

String accessToken = jwtUtil.createAccessToken(account);
log.info("생성 accessToken: Bearer {}", accessToken);
String refreshToken = jwtUtil.createRefreshToken(member);
String refreshToken = jwtUtil.createRefreshToken(account);
log.info("생성 refreshToken: Bearer {}", refreshToken);

response.addHeader("Authorization", "Bearer " + accessToken);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,8 @@ public class BaseEntity {

@Column(name = "deleted_at")
protected LocalDateTime deletedAt;

public void updateDeletedAt() {
this.deletedAt = LocalDateTime.now();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import org.springframework.data.domain.Slice;
import org.springframework.stereotype.Service;
import org.store.clothstar.member.dto.request.CreateMemberRequest;
import org.store.clothstar.member.dto.request.ModifyMemberRequest;
import org.store.clothstar.member.dto.request.ModifyNameRequest;
import org.store.clothstar.member.dto.response.MemberResponse;
import org.store.clothstar.member.service.MemberService;

Expand Down Expand Up @@ -35,8 +35,8 @@ public void emailCheck(String email) {
memberService.getMemberByEmail(email);
}

public void modifyMember(Long memberId, ModifyMemberRequest modifyMemberRequest) {
memberService.modifyMember(memberId, modifyMemberRequest);
public void modifyName(Long memberId, ModifyNameRequest modifyNameRequest) {
memberService.modifyName(memberId, modifyNameRequest);
}

public void modifyPassword(Long memberId, String password) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import org.store.clothstar.common.dto.MessageDTO;
import org.store.clothstar.common.util.MessageDTOBuilder;
import org.store.clothstar.member.application.MemberServiceApplication;
import org.store.clothstar.member.dto.request.ModifyMemberRequest;
import org.store.clothstar.member.dto.request.ModifyNameRequest;
import org.store.clothstar.member.dto.request.ModifyPasswordRequest;
import org.store.clothstar.member.dto.response.MemberResponse;

Expand Down Expand Up @@ -89,23 +89,23 @@ public ResponseEntity<MessageDTO> emailDuplicationCheck(@PathVariable String ema
return ResponseEntity.ok(messageDTO);
}

@Operation(summary = "회원 상세정보 수정", description = "회원 정보를 수정한다.")
@Operation(summary = "회원 이름 수정", description = "회원 이름을 수정한다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "회원 정보가 수정 되었습니다.",
content = @Content(schema = @Schema(implementation = MemberResponse.class))),
@ApiResponse(responseCode = "404", description = "회원 정보를 찾을 수 없습니다.",
content = @Content(schema = @Schema(implementation = ErrorResponseDTO.class))),
})
@PutMapping("/v1/members/{id}")
@PatchMapping("/v1/members/name/{id}")
public ResponseEntity<MessageDTO> modifyMember(@PathVariable("id") Long memberId,
@RequestBody ModifyMemberRequest modifyMemberRequest) {
log.info("회원수정 요청 데이터 : memberId={}, {}", memberId, modifyMemberRequest.toString());
@RequestBody ModifyNameRequest modifyNameRequest) {
log.info("회원 이름수정 요청 데이터 : memberId={}, {}", memberId, modifyNameRequest.toString());

memberServiceApplication.modifyMember(memberId, modifyMemberRequest);
memberServiceApplication.modifyName(memberId, modifyNameRequest);

MessageDTO messageDTO = MessageDTOBuilder.buildMessage(
HttpStatus.OK.value(),
"회원 정보가 수정 되었습니다."
"회원 이름이 수정 되었습니다."
);

return ResponseEntity.ok(messageDTO);
Expand Down
35 changes: 35 additions & 0 deletions src/main/java/org/store/clothstar/member/domain/Account.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package org.store.clothstar.member.domain;

import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "account")
public class Account {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long accountId;

@Column(unique = true)
private String email;
private String password;

@OneToMany(mappedBy = "account", cascade = CascadeType.REMOVE)
@JsonIgnore
private List<Authorization> authorizations = new ArrayList<>();

public void updatePassword(String password) {
this.password = password;
}
}
23 changes: 23 additions & 0 deletions src/main/java/org/store/clothstar/member/domain/Admin.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.store.clothstar.member.domain;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import lombok.*;
import org.store.clothstar.common.entity.BaseEntity;
import org.store.clothstar.member.dto.request.ModifyNameRequest;

@ToString
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "admin")
public class Admin extends BaseEntity {
@Id
private Long adminId;
private String name;

public void updateName(ModifyNameRequest modifyNameRequest, java.lang.reflect.Member member) {
this.name = name;
}
}
28 changes: 28 additions & 0 deletions src/main/java/org/store/clothstar/member/domain/Authorization.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package org.store.clothstar.member.domain;

import jakarta.persistence.*;
import lombok.*;

@ToString
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "authorizations")
public class Authorization {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long authorizationId;

@ManyToOne
@JoinColumn(name = "account_id")
private Account account;

@Enumerated(EnumType.STRING)
private MemberRole role;

public Authorization(Account account, MemberRole role) {
this.account = account;
this.role = role;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,27 +8,28 @@
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Collection;
import java.util.List;

@Getter
@ToString
@RequiredArgsConstructor
public class CustomUserDetails implements UserDetails {
private final Member member;
private final Account account;

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return List.of(new SimpleGrantedAuthority("ROLE_" + String.valueOf(member.getRole())));
return account.getAuthorizations().stream()
.map(role -> new SimpleGrantedAuthority("ROLE_" + role))
.toList();
}

@Override
public String getPassword() {
return member.getPassword();
return account.getPassword();
}

@Override
public String getUsername() {
return member.getEmail();
return account.getEmail();
}

@Override
Expand Down
Loading