Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/10 add token to api request #73

Merged
merged 6 commits into from
Jul 17, 2024
Merged
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
6 changes: 3 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,9 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'

// jwt
implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'
implementation 'io.jsonwebtoken:jjwt-api:0.12.3'
implementation 'io.jsonwebtoken:jjwt-impl:0.12.3'
implementation 'io.jsonwebtoken:jjwt-jackson:0.12.3'

// Annotation Processor
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public List<FriendRequestListResponseDTO> exec(Long userId, Integer page, Intege
.map(friendRequestDAO -> FriendRequestListResponseDTO.builder()
.friendId(friendRequestDAO.getId())
.friendEmail(userGetByIdSmallBean.exec(friendRequestDAO.getId()).getEmail())
.friendName(userGetByIdSmallBean.exec(friendRequestDAO.getId()).getName())
.friendName(userGetByIdSmallBean.exec(friendRequestDAO.getId()).getUsername())
.friendStatus(friendRequestDAO.getState())
.createdAt(friendRequestDAO.getCreatedAt())
.build())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public List<FriendRequestListResponseDTO> exec(Long userId, Integer page, Intege
.map(friendRequestDAO -> FriendRequestListResponseDTO.builder()
.friendId(friendRequestDAO.getFriendId())
.friendEmail(userGetByIdSmallBean.exec(friendRequestDAO.getFriendId()).getEmail())
.friendName(userGetByIdSmallBean.exec(friendRequestDAO.getFriendId()).getName())
.friendName(userGetByIdSmallBean.exec(friendRequestDAO.getFriendId()).getUsername())
.friendStatus(friendRequestDAO.getState())
.createdAt(friendRequestDAO.getCreatedAt())
.build())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public List<FriendListResponseDTO> exec(Member member, Integer page, Integer siz
return friendDAOS.stream().map(friendDAO -> FriendListResponseDTO.builder()
.friendId(friendDAO.getFriend().getId())
.friendEmail(friendDAO.getFriend().getEmail())
.friendName(friendDAO.getFriend().getName())
.friendName(friendDAO.getFriend().getUsername())
.createdAt(friendDAO.getCreatedAt())
.build()).collect(Collectors.toList());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,18 @@
package com.example.moreveiw.domain.friend.Bean.SmallBean.UserBean;

import com.example.moreveiw.domain.friend.Controller.ExceptionControll.InvalidException;
import com.example.moreveiw.domain.member.model.dao.Member;
import com.example.moreveiw.domain.member.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.Optional;

@Component
@RequiredArgsConstructor
public class UserGetByEmailSmallBean {

private final MemberRepository memberRepository;

public Member exec(String email) {
Optional<Member> member = memberRepository.findByEmail(email);
if (!member.isPresent()) {
throw new InvalidException("가입되지 않은 이메일입니다.");
}
return member.get();
return memberRepository.findByEmail(email)
.orElseThrow(() -> new IllegalArgumentException("No member with email: " + email));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.example.moreveiw.domain.friend.Bean.SmallBean.UserBean;

import com.example.moreveiw.domain.member.model.dao.Member;
import com.example.moreveiw.domain.member.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class UserGetByUsernameSmallBean {

private final MemberRepository memberRepository;

public Member exec(String username) {
return memberRepository.findByUsername(username);
}
}
Original file line number Diff line number Diff line change
@@ -1,25 +1,16 @@
package com.example.moreveiw.domain.member.controller;

import com.example.moreveiw.domain.member.model.dto.TokenDto;
import com.example.moreveiw.domain.member.model.dto.request.MemberLoginRequest;
import com.example.moreveiw.domain.member.model.dto.request.MemberRequest;
import com.example.moreveiw.domain.member.model.dto.request.AuthRequest;
import com.example.moreveiw.domain.member.model.dto.response.MemberResponse;
import com.example.moreveiw.domain.member.service.AuthService;
import com.example.moreveiw.domain.member.service.MemberService;
import com.example.moreveiw.global.security.jwt.JwtFilter;
import com.example.moreveiw.global.security.jwt.TokenProvider;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;

@RestController
Expand All @@ -28,34 +19,21 @@
@Tag(name = "Member Controller", description = "회원 관련 API")
public class MemberController {

private final TokenProvider tokenProvider;
private final AuthenticationManagerBuilder authenticationManagerBuilder;
private final MemberService memberService;
private final AuthService authService;

@PostMapping("/sign-in")
@PostMapping(value = "/signup", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@Operation(summary = "회원가입", description = "새로운 회원을 가입시킵니다.")
public String signup(@RequestPart("email") String email,
@RequestPart("username") String username,
@RequestPart("password") String password) {
AuthRequest request = new AuthRequest(email, username, password);
authService.signup(request);
return "회원가입 완료";
public ResponseEntity<MemberResponse> signIn(@Valid @RequestBody MemberRequest request) {
return ResponseEntity.ok(memberService.signup(request));
}

@PostMapping("/login")
@Operation(summary = "로그인", description = "회원 로그인을 처리합니다.")
public ResponseEntity<TokenDto> authorize(@Valid @RequestBody MemberLoginRequest request) {

UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(request.getEmail(), request.getPassword());

Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken);
SecurityContextHolder.getContext().setAuthentication(authentication);

String jwt = tokenProvider.createToken(authentication);

HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add(JwtFilter.AUTHORIZATION_HEADER, "Bearer " + jwt);

return new ResponseEntity<>(new TokenDto(jwt, memberService.findByEmailOptional(request.getEmail()).get().getId()), httpHeaders, HttpStatus.OK);
}

@GetMapping("/user")
@PreAuthorize("hasAnyRole('USER','ADMIN')")
@Operation(summary = "유저 정보 조회", description = "로그인한 유저의 정보를 조회합니다.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.example.moreveiw.domain.base.BaseEntity;
import com.example.moreveiw.domain.friend.Model.DAO.FriendDAO;
import com.example.moreveiw.domain.project.model.dao.Project;
import com.example.moreveiw.domain.project.model.dao.ProjectLinkMember;
import jakarta.persistence.*;
import jakarta.validation.constraints.Email;
Expand All @@ -14,6 +13,7 @@

@Entity
@Getter
@Setter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
Expand All @@ -25,7 +25,7 @@ public class Member extends BaseEntity {
@Column(name = "user_id")
private Long id;

private String name;
private String username;
private String password;

@Email
Expand Down
Original file line number Diff line number Diff line change
@@ -1,40 +1,24 @@
package com.example.moreveiw.domain.member.model.dao;

import com.example.moreveiw.domain.member.model.dto.request.MemberRequest;
import com.example.moreveiw.domain.member.model.dto.response.MemberListResponse;
import com.example.moreveiw.domain.member.model.dto.response.MemberResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

@Component
@RequiredArgsConstructor
public class MemberMapper {

private final PasswordEncoder passwordEncoder;

public Member toEntity(MemberRequest request) {

Member member = Member.builder()
.name(request.getName())
.email(request.getEmail())
.password(passwordEncoder.encode(request.getPassword()))
.build();

return member;
}

public MemberResponse toResponse(Member member) {
if (member == null) return null;

return MemberResponse.builder()
.email(member.getEmail())
.role(member.getRole())
.name(member.getName())
.username(member.getUsername())
.build();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package com.example.moreveiw.domain.member.model.dao;

public enum Role {
ADMIN, USER
ROLE_ADMIN, ROLE_USER
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.example.moreveiw.domain.member.model.dto;

import com.example.moreveiw.domain.member.model.dao.Member;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.ArrayList;
import java.util.Collection;

@RequiredArgsConstructor
public class CustomUserDetails implements UserDetails {

private final Member member;

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {

Collection<GrantedAuthority> collection = new ArrayList<>();

collection.add(new GrantedAuthority() {

@Override
public String getAuthority() {

return member.getRole();
}
});

return collection;
}

@Override
public String getPassword() {

return member.getPassword();
}

@Override
public String getUsername() {

return member.getUsername();
}

@Override
public boolean isAccountNonExpired() {

return true;
}

@Override
public boolean isAccountNonLocked() {

return true;
}

@Override
public boolean isCredentialsNonExpired() {

return true;
}

@Override
public boolean isEnabled() {

return true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.example.moreveiw.domain.member.model.dto.request;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class AuthLoginRequest {

private String username;
private String password;
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,14 @@
package com.example.moreveiw.domain.member.model.dto.request;

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import lombok.*;

@Getter
@Setter
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MemberLoginRequest {
@NotBlank
public class AuthRequest {

@Email
private String email;
@NotBlank
private String username;
private String password;
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,18 +1,15 @@
package com.example.moreveiw.domain.member.model.dto.response;

import jakarta.validation.constraints.Email;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

import java.util.Set;

@AllArgsConstructor
@Builder
@Getter
public class MemberResponse {

private String name;
private String username;
private String password;
private String email;
private String role;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,13 @@
@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {

Boolean existsByUsername(String username);

Member findByUsername(String username);

Optional<Member> findByEmail(String email);

@EntityGraph(attributePaths = "authorities")

Optional<Member> findOneWithAuthoritiesByEmail(String email);
}
Loading
Loading