//Question, Answer 클래스에 추가
//회원은 게시글, 답변을 여러개 쓸 수 있음
//Many: Q/A, One: User
@ManyToOne
private SiteUser author;
현재 코드에서는 로그아웃 상태에서 질문 또는 답변을 달 때 500 오류(서버 오류)가 발생하게 된다.
principal 객체가 null이라 발생한 오류로 principal 객체는 로그인을 해야만 생성되는 객체인데 현재는 로그아웃 상태이므로 principal 객체에 값이 없어 오류가 발생하는 것이다.
문제 해결 → principal 객체를 사용하는 객체에 @PreAuthorize(”isAuthenticated()”) 애너테이션을 사용해야 한다.
<aside> 💡 @PreAuthorize(”isAuthenticated()”) 로그인한 경우애만 실행이 되게 하는 애너테이션. 즉, 이 애너테이션을 메서드에 붙이면 해당 메서드는 로그인한 사용자만 호출할 수 있다. 애너테이션이 적용된 메서드가 로그아웃 상태에서 호출되면 로그인 페이지로 강제 이동 된다.
</aside>
이미 QuestionController와 AnswerController는 수정이 되어있고, SecurityConfig.java 파일에 해당 코드만 추가해주면 된다.
//SecurityConfig.java
//해당 부분은 컨트롤러에서 로그인 여부를 판별할 때 사용한 @PreAuthorize 애너테이션을
//사용하기 위해 번드시 필요한 설정이다.
@Configuration
@EnableWebSecurity
@EnableMethodSecurity(prePostEnabled = true)
로그아웃 상태에서 답변을 작성하지 못하도록 하자.
<!-- question_detail.html 코드 수정-->
<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>