질문 혹은 답변을 작성할 때 어떤 사람이 작성했는지 알 수 있는 기능이 있으면 좋지 않을까?
그래서 작성자를 등록하고, 출력할 수 있도록 해보자.
1. 엔티티 변경
Question과 Answer을 작성한 작성자를 저장하기 위해 엔티티를 수정해야 한다.
@ManyToOne
private SiteUser author;
각각 Question.java와 Answer.java 파일에 SiteUser을 저장할 수 있도록 엔티티를 수정한다.
2. AnswerController 수정
현재 로그인 되어있는 유저를 확인하기 위해 Principal 객체를 사용한다.
매개변수로 Pricipal 객체를 줄 수 있도록 한다.
public String createAnswer(Model model, @PathVariable("id") Integer id,
@Valid AnswerForm answerForm, BindingResult bindingResult, Principal principal)
Principal 객체란?
현재 로그인된 사용자를 확인하기 위해 Spring Security가 제공하는 객체.
Principal 객체를 사용하는 방법은
SiteUser siteUser = this.userService.getUser(principal.getName());
getName을 사용하여 로그인된 사용자의 id를 가져올 수 있다.
3. UserService 수정
현재 로그인된 SiteUser객체를 사용자 명을 통해 가져오기 위해 UserService를 수정한다.
public SiteUser getUser(String username) {
Optional<SiteUser> siteUser = this.userRepository.findByusername(username);
if (siteUser.isPresent()) {
return siteUser.get();
} else {
throw new DataNotFoundException("siteuser not found");
}
}
4. AnswerService 수정
작성자 정보를 확인하기 위해 AnswerService의 create 메서드에 작성자를 수정한다.
public Answer create(Question question, String content, SiteUser author) {
Answer answer = new Answer();
answer.setContent(content);
answer.setCreateDate(LocalDateTime.now());
answer.setQuestion(question);
answer.setAuthor(author);
this.answerRepository.save(answer);
return answer;
}
왜 SiteUser 객체를 통째로 들고오나?
이는 SiteUser 객체를 들고온다는 뜻이 아닌 SiteUser_id를 사용한다는 뜻이다.
이를 보면 author_id를 사용한다는 것을 알 수 있다.
5. AnswerService.create()를 사용하기 위한 수정
create 메서드를 사용하기 위해 SiteUser 객체를 넣어주어야 한다.
그러기 위해서는 Principal 객체를 사용해 사용자를 불러오고, 사용자를 create 메서드의 파라미터로 넣어주어야 한다.
public String createAnswer(Model model, @PathVariable("id") Integer id,
@Valid AnswerForm answerForm, BindingResult bindingResult, Principal principal) {
Question question = this.questionService.getQuestion(id);
SiteUser siteUser = this.userService.getUser(principal.getName());
if (bindingResult.hasErrors()) {
model.addAttribute("question", question);
return "question_detail";
}
this.answerService.create(question, answerForm.getContent(), siteUser);
return String.format("redirect:/question/detail/%s", id);
}
이와 같이 답변이 아닌 질문도 가능하다.
그런데, 로그아웃된 상태에서 작성하면 오류가 발생한다.
이는 Principal객체가 필요하기 때문인데, 어노테이션 하나를 넣어 로그인이 되어있지 않다면 로그인을 자동으로 할 수 있도록 하자.
@PreAuthorize("isAuthenticated()")
이는 로그인이 필요한 메서드임을 의미하는데, create하는 모든 메서드에 붙여주자.
마지막으로 @PreAuthorize("isAuthenticated()") 어노테이션을 사용하기 위해 SecurityConfig 클래스에 꼭 @EnableGlobalMethodSecurity(prePostEnabled = true) 어노테이션을 붙여주어야 한다.
그러면 작성자까지 등록 하였으니 출력을 시킬 수 있도록 해보자.
question_detail.html / question_list.html 파일을 작성자까지 포함하여 출력하도록 수정해보자.
- 리스트
- 상세
작성자까지 잘 나온다.
'Spring' 카테고리의 다른 글
[Spring]기능 - 추천 기능 (0) | 2022.08.23 |
---|---|
[Spring]기능 - 질문 수정 및 삭제 (0) | 2022.08.22 |
[Spring]기능 - 회원가입 (0) | 2022.08.18 |
CSRF(Cross Site Request Forgery) (0) | 2022.08.18 |
[Spring]Spring Security (0) | 2022.08.18 |