• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 Spring 게시판 현재 로그인 중인 유저의 데이터 가져오기

현재 로그인 중인 유저의 데이터 가져오기

5 글 보임 - 1 에서 5 까지 (총 5 중에서)
  • 글쓴이
  • #123986

    윤형주
    참가자
    기존 코드는 현재 로그인 중인 유저의 이름을 Spring security로 가져와 db에서 가져오는 코드였습니다. 
    하지만 중복된 이름을 가진 유저가 발생해 쿼리 결과가 2개 이상 리턴이 되는 문제가 발생해 검색을 로그인 한 유저의 email로 db에서 찾아
    리턴 하려고 합니다. 현재 로그인 중인 유저의 이름은 정상적으로 나오지만, email은 null값이 나와 이런 저런 코드를 수정해보고 채찍피티를 돌려도
    항상 결과가 null 값입니다. 최근 몇주간 전혀 해결할 방법을 찾지못해 너무 답답합니다. 도와주세요~!!! ㅠㅠㅠ
    package garabu.garabuServer.domain;
    import jakarta.persistence.*;
    import jakarta.validation.constraints.Email;
    import lombok.Getter;
    import lombok.Setter;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.UUID;
    @Entity
    @Getter @Setter
    public class Member {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "member_id")
        private Long id;            // 회원 식별자 Id
        @Column(updatable = false, unique = true)
        private UUID uuid = UUID.randomUUID();  // 회원의 UUID
        private String username;        // 닉네임
        private String name;
        @Email
        private String email;       // 이메일
        private String password;         // 비번
        private String role;
        @OneToMany(mappedBy = "member")
        private List<UserBook> userBooks = new ArrayList<>();
    }
    ----------------------------------------------------------
    
    
    package garabu.garabuServer.service;
    import garabu.garabuServer.domain.Book;
    import garabu.garabuServer.domain.Member;
    import garabu.garabuServer.jwt.CustomUserDetails;
    import garabu.garabuServer.repository.BookRepository;
    import garabu.garabuServer.repository.MemberJPARepository;
    import lombok.RequiredArgsConstructor;
    import org.springframework.security.core.Authentication;
    import org.springframework.security.core.context.SecurityContextHolder;
    import org.springframework.security.core.userdetails.UserDetails;
    import org.springframework.stereotype.Service;
    import java.util.List;
    import java.util.UUID;
    @Service
    @RequiredArgsConstructor
    public class BookService {
        private final BookRepository bookRepository;
        private final MemberJPARepository memberRepository;
        public Book createBook(String title) {
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            String currentUserName = authentication.getName();
            Member owner = memberRepository.findByUsername(currentUserName);
            Book book = new Book();
            book.setOwner(owner);
            book.setTitle(title);
            bookRepository.save(book);
            return book;
        }
        private String getEmail(){
            Authentication loggedInUser = SecurityContextHolder.getContext().getAuthentication();
            return loggedInUser.getName();
        }
        public List<Book> findLoggedInUserBooks() {
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            CustomUserDetails userDetails = (CustomUserDetails) authentication.getPrincipal();
            String email = userDetails.getEmail();
            System.out.println(authentication);
            System.out.println(userDetails                                         );
            System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
            System.out.println(email);
            Member owner = memberRepository.findOneByEmail(email);
            return bookRepository.findByOwner(owner);
        }
        public Book findById(Long id) {
            return bookRepository.findById(id).orElseThrow(() -> new RuntimeException("Book not found"));
        }
        public Book findByTitle(String title) {
            return bookRepository.findByTitle(title);
        }
        //book. 가계부를 커플, 개인, 모임용으로 나누기 위해.
        //사용자 입력
        //가계부 이름 등록
        //
    }
    
    
    
    ------------------------------------------------------
    
    
    package garabu.garabuServer.jwt;
    import garabu.garabuServer.domain.Member;
    import org.springframework.security.core.GrantedAuthority;
    import org.springframework.security.core.userdetails.UserDetails;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.UUID;
    public class CustomUserDetails implements UserDetails {
        private final Member member;
        public CustomUserDetails(Member member) {
            this.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();
        }
        public String getEmail() {
            return member.getEmail();
        }
        public UUID getUuid() {
            return member.getUuid();
        }
        @Override
        public boolean isAccountNonExpired() {
            return true;
        }
        @Override
        public boolean isAccountNonLocked() {
            return true;
        }
        @Override
        public boolean isCredentialsNonExpired() {
            return true;
        }
        @Override
        public boolean isEnabled() {
            return true;
        }
    }
    
    
    -----------------------------------------------
    
    
    
    
    
    
    package garabu.garabuServer.api;
    import garabu.garabuServer.domain.Book;
    import garabu.garabuServer.service.BookService;
    import jakarta.validation.Valid;
    import lombok.Data;
    import lombok.RequiredArgsConstructor;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RestController;
    import java.util.List;
    @RestController
    @RequiredArgsConstructor
    public class BookApiController {
        private final BookService bookService;
        @PostMapping("/api/v2/book")
        public CreateBookResponse saveBookV2(@RequestBody @Valid CreateBookRequest request) {
            // BookService 내에서 현재 로그인한 사용자를 기반으로 새로운 Book을 생성
            Book book = bookService.createBook(request.getTitle());
            return new CreateBookResponse(book.getId());
        }
        @GetMapping("/api/v2/book/mybooks")
        public ResponseEntity<List<Book>> getMyBooks() {
            List<Book> books = bookService.findLoggedInUserBooks();
            return ResponseEntity.ok(books);
        }
        @Data
        static class CreateBookRequest {
            private String title; // 가계부 이름
        }
        @Data
        static class CreateBookResponse {
            private Long id; // 생성된 가계부의 ID
            public CreateBookResponse(Long id) {
                this.id = id;
            }
        }
    }
    
     
    -----------------------------------------------
    package garabu.garabuServer.repository;
    import garabu.garabuServer.domain.Member;
    import org.springframework.data.jpa.repository.JpaRepository;
    import java.util.List;
    public interface MemberJPARepository extends JpaRepository<Member, Long> {
        List<Member> findByEmail(String email);
        Member findByUsername(String username);
        Member findOneByEmail(String email);
    }
    
     
    #124003

    윤형주
    참가자
    어느 코드를 보내드려야할지 몰라 일단 서버측 연관 코드만 올립니다..... 혹시 괜찮으시다면 이메일로 압축파일을 드리거나 github 주소를 드리고
    전체 코드에서의 문제점을 피드백 받아보고싶습니다...
    
    
    #124027

    codingapple
    키 마스터
    .findByEmail(이메일)로 찾아봅시다
    #124061

    윤형주
    참가자
    네... 해당 메서드로 검색하면 null 값이 나옵니다.. userdtails나 OAuth2service에서 email을 추가해 사용해도 null 입니다 ..ㅜㅜ
    
    
     
    #124080

    codingapple
    키 마스터
    String email = userDetails.getEmail(); 변수가 문자로 잘나오나 뒤에 이상한 공백 없나 확인해봅시다
5 글 보임 - 1 에서 5 까지 (총 5 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관, 개인정보처리방침
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠