단 하나의 맥락
: author를 추가하여 작성자 표시 준비
Semiflow Bundle
: Question Entity에 author 추가
: Answer Entity에 author 추가
: AnswerController에 Principal principal S 추가
: UserService에서 getUser 메소드 생성
: AnswerService에서 답변 생성 메서드에 author 추가
:
Question에 author 속성 추가하기 위해
> Question 에
@ManyToOne
private SiteUser author;
// import javax.persistence.ManyToOne;
// import com.mysite.sbb.user.SiteUser;
-
Answer에 author 속성 추가하기 위해
> Answer에
@ManyToOne
private SiteUser author
// import com.mysite.sbb.user.SiteUser;
-
답변에 작성자 저장하기 위해
> AnswerController에
- @PostMapping("/create/{id}")
- public String createAnswer
- (Model model, @PathVariable("id") Integer id, @Valid AnswerForm answerForm, BindingResult bindingResult, Principal principal)
S 추가
// import java.security.Principal;
-
> UserService에
- M : public SiteUser getUser(String username) {}
- A1 : Optional<SiteUser> siteUser = this.userRepository.findByusername(username);
- A2 :
- if (siteUser.isPresent()) { return siteUser.get(); }
- else { throw new DataNotFoundException("siteuser not found"); }
// import java.util.Optional;
// import com.mysite.sbb.DataNotFoundException;
-
> AnswerService에
- M : public Answer create
- S : (Question question, String content, SiteUser author) 추가
- A : answer.setAuthor(author); 추가
-
> AnswerController에
// import com.mysite.sbb.user.SiteUser;
// import com.mysite.sbb.user.UserService;
- P : private final UserService userService 추가
- @PostMapping("/create/{id}")
- M : public String createAnswer에
- A : SiteUser siteUser = this.userService.getUser(principal.getName()); 추가
- A : this.answerService.create(question, answerForm.getContent(), siteUser) 추가
-
질문에 작성자 저장하기
> QuestionService에서
- M : public void create
- S : (String subject, String Content, SiteUser user) 추가
- A : q.getAuthor(user); 추가
// import com.mysite.sbb.user.SiteUser;
-
> QuestionContorller에서
- P : private final UserService userService; 추가
- @PostMapping("/create")
- M : public String questionCreate
- S : (@Valid QuestionForm questionForm, BindingResult bindingResult, Principal principal) 추가
- A : SiteUser siteUser = this.userService.getUser(principal.getName()); 추가
// import java.security.Principal;
// import com.mysite.sbb.user.SiteUser;
// import com.mysite.sbb.user.UserService;
-
로그아웃 상태에서 질문, 답변 등록을 막고, 로그인 유도하기
> QuestionController 에서
- @GetMappng("/create")
- public String questionCreate(QuestionForm questionForm)
- @PostMapping("/create")
- public String questionCreate(@Valid QuestionForm questionForm, BindingResult bindingResult, Principal principal)
> AnswerController 에서
- @PostMapping("/create/{id}")
- public String createAnswer(Model model, @PathVariable("id") Integer id, @Valid AnswerForm answerForm, BindingResult bindingResult, Principal principal)
메소드에
- @PreAuthorize("isAuthenticated()")
를 추가한다
// import org.springframework.security.access.prepost.PreAuthorize;
-
또 @PreAuthorize 가 작동할 수 있도록
> SecurityConfig에서
- @Configuration
- @EnableWebSecurity
- public class SecuirityConfig {}
에 @EnableGlobalMethodSecurity(prePostEnabled = true) 를 추가한다
// import org.sprinframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
-
로그아웃 상태에서는 답변 작성을 막기 위해
> question_detail.html 에서
답변 등록 파트에 위상을 추가한다
- <textarea th:field="*{content}" rows="10" class="form-control"></textarea>
를
- <textarea sec:authorize="isAnonymous()" disabled th:field="*{content}" class="form-control" rows="10"></textarea>
- <textarea sec:authorize="isAuthenticated()" th:field="*{content}" class="form-control" rows="10"></textarea>
로 변경
'포트폴리오 > SPRINGBOOT 옛날' 카테고리의 다른 글
3-10 수정과 삭제 (0) | 2022.10.10 |
---|---|
3 - 09 : 글쓴이 표시 (0) | 2022.10.10 |
3-07 : 로그인과 로그아웃 (0) | 2022.10.09 |
3-06 : 회원가입 (0) | 2022.10.09 |
3-05 : spring security (3) | 2022.10.09 |