Skip to content

Commit

Permalink
fix(#6) : claim에 role 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
aeeazip committed Sep 13, 2024
1 parent 1684e4e commit d580414
Show file tree
Hide file tree
Showing 17 changed files with 375 additions and 139 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ public LoginDto.Response login(LoginDto.Request request) {
if(!result)
throw new BadRequestException("비밀번호가 일치하지 않습니다.", HttpStatus.BAD_REQUEST);

String accessToken = jwtProvider.encodeJwtToken(member.getId()); // 1. 액세스 토큰 발급
String refreshToken = jwtProvider.encodeJwtRefreshToken(member.getId()); // 2. 리프레시 토큰 발급
jwtProvider.storeJwtRefreshToken(member.getId(), refreshToken); // 3. 리프레시 redis에 저장
String accessToken = jwtProvider.encodeJwtToken(member.getId(), member.getRole()); // 1. 액세스 토큰 발급
String refreshToken = jwtProvider.encodeJwtRefreshToken(member.getId(), member.getRole()); // 2. 리프레시 토큰 발급
jwtProvider.storeJwtRefreshToken(member.getId(), member.getRole(), refreshToken); // 3. 리프레시 redis에 저장

return new LoginDto.Response(accessToken, refreshToken);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ public SignUpDto.Response signup(SignUpDto.Request request) {
}

Member member = memberService.signup(request); // 1. 회원 DB에 저장
String accessToken = jwtProvider.encodeJwtToken(member.getId()); // 2. access token 발급
String refreshToken = jwtProvider.encodeJwtRefreshToken(member.getId()); // 3. refresh token 발급
jwtProvider.storeJwtRefreshToken(member.getId(), refreshToken); // 4. redis에 refresh token 저장
String accessToken = jwtProvider.encodeJwtToken(member.getId(), member.getRole()); // 2. access token 발급
String refreshToken = jwtProvider.encodeJwtRefreshToken(member.getId(), member.getRole()); // 3. refresh token 발급
jwtProvider.storeJwtRefreshToken(member.getId(), member.getRole(), refreshToken); // 4. redis에 refresh token 저장

return new SignUpDto.Response(accessToken, refreshToken);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
import org.springframework.http.HttpStatus;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.Optional;

@Slf4j
Expand Down Expand Up @@ -80,8 +82,10 @@ public boolean checkPassword(Member member, String password) {

// 로그아웃
public boolean logout(String token) {
Long memberId = jwtProvider.getMemberIdFromJwtToken(token);
jwtProvider.expireToken(memberId, token);
Map<String, Object> memberInfo = jwtProvider.getMemberInfoFromJwtToken(token);
Long memberId = (Long) memberInfo.get("memberId");
Role role = (Role) memberInfo.get("role");
jwtProvider.expireToken(memberId, role, token);
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.Optional;


Expand Down Expand Up @@ -60,8 +61,8 @@ public OAuthLoginDto.Response kakaoLogin(OAuthLoginDto.Request kakaoReqDto) {
// accessToken, refreshToken 발급
@Transactional
public OAuthLoginDto.Response createToken(Member member) {
String newAccessToken = jwtProvider.encodeJwtToken(member.getId());
String newRefreshToken = jwtProvider.encodeJwtRefreshToken(member.getId());
String newAccessToken = jwtProvider.encodeJwtToken(member.getId(), member.getRole());
String newRefreshToken = jwtProvider.encodeJwtRefreshToken(member.getId(), member.getRole());

System.out.println("newAccessToken : " + newAccessToken);
System.out.println("newRefreshToken : " + newRefreshToken);
Expand All @@ -84,7 +85,8 @@ public OAuthLoginDto.Response regenerateAccessToken(String accessToken, String r
if(!jwtProvider.validateToken(refreshToken)) // refresh token 유효성 검사
throw new BadRequestException("유효하지 않은 Refresh Token입니다. 다시 로그인하세요.", HttpStatus.UNAUTHORIZED);

Long memberId = jwtProvider.getMemberIdFromJwtToken(refreshToken);
Map<String, Object> memberInfo = jwtProvider.getMemberInfoFromJwtToken(refreshToken);
Long memberId = (Long) memberInfo.get("memberId");
log.info("memberId : " + memberId);

Optional<Member> getMember = memberRepository.findById(memberId);
Expand All @@ -95,8 +97,8 @@ public OAuthLoginDto.Response regenerateAccessToken(String accessToken, String r
// if(!refreshToken.equals(member.getRefreshToken()))
// throw new ExceptionHandler(REFRESH_TOKEN_UNAUTHORIZED);

String newRefreshToken = jwtProvider.encodeJwtRefreshToken(memberId);
String newAccessToken = jwtProvider.encodeJwtToken(memberId);
String newRefreshToken = jwtProvider.encodeJwtRefreshToken(memberId, member.getRole());
String newAccessToken = jwtProvider.encodeJwtToken(memberId, member.getRole());

// member.updateRefreshToken(newRefreshToken);
memberRepository.save(member);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.chuca.memberservice.domain.owner.dto;
package com.chuca.memberservice.domain.owner.application.dto;

import com.chuca.memberservice.domain.owner.domain.constant.Bank;
import jakarta.validation.constraints.NotBlank;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.chuca.memberservice.domain.owner.dto;
package com.chuca.memberservice.domain.owner.application.dto;

import com.chuca.memberservice.domain.owner.domain.entity.Cafe;
import jakarta.validation.constraints.NotBlank;
Expand All @@ -13,16 +13,12 @@ public class CafeDto {
public static class Request {
@NotBlank(message = "카페명을 입력해주세요.")
private String name;

@NotBlank(message = "카페 전화번호를 입력해주세요.")
private String phone;

@NotBlank(message = "주소를 입력해주세요.")
private String address;

@NotNull
private Double latitude;

@NotNull
private Double longitude;
}
Expand All @@ -33,15 +29,17 @@ public static class Request {
@Builder
public static class Response {
private Long cafeId;

private String name;

private String status;
private String accessToken;
private String refreshToken;

public Response(Cafe cafe) {
public Response(Cafe cafe, String accessToken, String refreshToken) {
this.cafeId = cafe.getId();
this.name = cafe.getName();
this.status = "입점 신청이 완료되었습니다.";
this.accessToken = accessToken;
this.refreshToken = refreshToken;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.chuca.memberservice.domain.owner.dto;
package com.chuca.memberservice.domain.owner.application.dto;


import jakarta.validation.constraints.NotBlank;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.chuca.memberservice.domain.owner.dto;
package com.chuca.memberservice.domain.owner.application.dto;

import com.chuca.memberservice.domain.owner.domain.constant.Bank;
import com.chuca.memberservice.global.annotation.Enum;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.chuca.memberservice.domain.owner.application.usecase;

public class OwnerLoginUseCase {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.chuca.memberservice.domain.owner.application.usecase;

public class OwnerReissueUseCase {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.chuca.memberservice.domain.owner.application.usecase;

import com.chuca.memberservice.domain.owner.application.dto.CafeDto;
import com.chuca.memberservice.domain.owner.application.dto.OwnerDto;
import com.chuca.memberservice.domain.owner.domain.entity.Cafe;
import com.chuca.memberservice.domain.owner.domain.entity.Owner;
import com.chuca.memberservice.domain.owner.domain.service.OwnerService;
import com.chuca.memberservice.global.annotation.UseCase;
import com.chuca.memberservice.global.security.JwtProvider;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;

@UseCase
@Transactional
@RequiredArgsConstructor
public class OwnerSignUpUseCase {
private final OwnerService ownerService;
private final JwtProvider jwtProvider;

// 회원가입 및 입점 신청
public CafeDto.Response signup(OwnerDto.Request request) {
Owner owner = ownerService.signup(request); // 1. 사장님 DB에 저장
Cafe cafe = ownerService.enrollCafe(owner, request.getCafeDto()); // 2. 카페 DB에 저장
String accessToken = jwtProvider.encodeJwtToken(owner.getId(), owner.getRole()); // 2. access token 발급
String refreshToken = jwtProvider.encodeJwtRefreshToken(owner.getId(), owner.getRole()); // 3. refresh token 발급
jwtProvider.storeJwtRefreshToken(owner.getId(), owner.getRole(), refreshToken); // 4. redis에 refresh token 저장

return new CafeDto.Response(cafe, accessToken, refreshToken);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.chuca.memberservice.domain.owner.domain.entity;

import com.chuca.memberservice.domain.owner.dto.CafeDto;
import com.chuca.memberservice.domain.owner.application.dto.CafeDto;
import com.chuca.memberservice.global.entity.BaseTime;
import jakarta.persistence.*;
import lombok.AccessLevel;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.chuca.memberservice.domain.owner.domain.entity;

import com.chuca.memberservice.domain.member.domain.constant.Role;
import com.chuca.memberservice.domain.owner.domain.constant.Bank;
import com.chuca.memberservice.global.entity.BaseTime;
import jakarta.persistence.*;
Expand All @@ -10,8 +11,13 @@
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

@Getter
Expand All @@ -20,7 +26,7 @@
@DynamicUpdate
@Entity
@Table(name = "owner")
public class Owner extends BaseTime {
public class Owner extends BaseTime implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ownerId")
Expand Down Expand Up @@ -67,13 +73,17 @@ public class Owner extends BaseTime {
@ColumnDefault("'active'")
private String status; // 상태

@Column(nullable = false)
@Enumerated(EnumType.STRING)
private Role role; // 권한

@OneToMany(mappedBy="owner", cascade=CascadeType.ALL)
private List<Cafe> cafes;


@Builder
public Owner(String email, String businessNum, String businessImage, LocalDate openingDate, String password,
String name, String phone, String account, Bank bank, boolean agreeOption, String nickname, String profileImage) {
String name, String phone, String account, Bank bank, boolean agreeOption, String nickname, String profileImage, Role role) {
this.email = email;
this.businessNum = businessNum;
this.businessImage = businessImage;
Expand All @@ -86,5 +96,66 @@ public Owner(String email, String businessNum, String businessImage, LocalDate o
this.agreeOption = agreeOption;
this.nickname = nickname;
this.profileImage = profileImage;
this.role = role;
}

/**** UserDetails 오버라이딩 메소드 ****/

/*
* 유저의 권한 반환
*/
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
ArrayList<SimpleGrantedAuthority> simpleGrantedAuthorities = new ArrayList<>();
simpleGrantedAuthorities.add(new SimpleGrantedAuthority(role.getRole()));
return simpleGrantedAuthorities;
}

/*
* 유저 Id(PK) 반환
*/
@Override
public String getUsername() {
return String.valueOf(id);
}

/*
* 계정 만료 여부
* true : 만료 X
* false : 만료 O
*/
@Override
public boolean isAccountNonExpired() {
return false;
}

/*
* 계정 잠김 여부
* true : 잠김 X
* false : 잠김 O
*/
@Override
public boolean isAccountNonLocked() {
return false;
}

/*
* 비밀번호 만료 여부
* true : 만료 X
* false : 만료 O
*/
@Override
public boolean isCredentialsNonExpired() {
return false;
}

/*
* 사용자 활성화 여부
* true : 활성화 O
* false : 활성화 X
*/
@Override
public boolean isEnabled() {
return false;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.chuca.memberservice.domain.owner.domain.service;

import com.chuca.memberservice.domain.member.domain.repository.MemberRepository;
import com.chuca.memberservice.domain.owner.domain.repository.OwnerRepository;
import com.chuca.memberservice.global.exception.BadRequestException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

@Slf4j
@RequiredArgsConstructor
@Service
public class OwnerDetailServiceImpl implements UserDetailsService {
private final OwnerRepository ownerRepository;

@Override
public UserDetails loadUserByUsername(String ownerId) throws UsernameNotFoundException {
System.out.println("로그인한 ownerId : " + ownerId);
UserDetails result = (UserDetails) ownerRepository.findById(Long.parseLong(ownerId))
.orElseThrow(() -> new BadRequestException("해당하는 사용자를 찾을 수 없습니다.", HttpStatus.BAD_REQUEST));
return result;
}

}
Loading

0 comments on commit d580414

Please sign in to comment.