로그인 시 User객체로 반환되는 정보들은 username, password, authorities였다. 여기서 username과 별개로 nickname을 추가하기위해서 User객체를 커스텀해야한다.
@Getter
public class CustomUser extends User {
private final String nickname;
public CustomUser(String username, String password, List<GrantedAuthority> authorities, String nickname){
super(username, password, authorities);
this.nickname = nickname;
}
}
그 후 회원가입에 쓰이는 loadUserByUsername을 수정
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
...
return new CustomUser(member.getUsername(), member.getPassword(), authorities, member.getNickname());
}
@Override
@Transactional
public void uploadProduct(ProductDTO productDTO, MultipartFile[] imageFiles) {
...
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
// 현재 사용자의 닉네임 가져오기
String writerName = ((CustomUser) authentication.getPrincipal()).getNickname();
// ProductDTO로부터 상품 정보를 추출하여 Product 엔티티를 생성
Product product = Product.builder()
...
.writerName(writerName)
...
// 상품을 저장
productRepository.save(product);
}
흠.. 근데 좀 번거로운거같은데.. 라는 생각이 든다.
그래서 방법을 찾아보니까 Post요청시에 @AuthenticationPrincipal
이라는 어노테이션을 사용한다면 해결할수있었다.
@AuthenticationPrincipal
은 세션정보 UserDetails에 접근할 수 있어는데 위의 1안과 동일하게 SecurityContextHolder에서 principal를 가져오는 어노테이션이다.
@PostMapping("/upload")
public String uploadProduct(@Valid @ModelAttribute("productDTO") ProductDTO productDTO,
@RequestParam("imageFiles") MultipartFile[] imageFiles,
BindingResult bindingResult,
@AuthenticationPrincipal CustomUser customUser
) {
if (bindingResult.hasErrors()) {
return "product/uploadForm";
}
// 이미지 파일들과 함께 상품 정보를 서비스로 전달하여 상품을 업로드
productService.uploadProduct(productDTO, customUser.getNickname(), imageFiles);
return "redirect:/product/list";
}
@Override
@Transactional
public void uploadProduct(ProductDTO productDTO, String nickname, MultipartFile[] imageFiles) {
...
// ProductDTO로부터 상품 정보를 추출하여 Product 엔티티를 생성
Product product = Product.builder()
.productName(productDTO.getProductName())
.category(productDTO.getCategory())
.writerName(nickname)
...
// 상품을 저장
productRepository.save(product);
}
이제 찜기능 구현하면 될거같은데 이거 구현하고 뷰좀 다듬고 서버배포하면 끝날듯?