게시판 8 - 글쓴이 추가

JIWOO YUN·2024년 4월 23일
0

게시판만들기

목록 보기
8/21
post-custom-banner

글쓴이 항목 추가하기

  • 현재 회원 객체를 만들어서 회원가입, 로그인 ,로그아웃까지 구현되어있다.
  • 질문을 적은 자가 누군지 알기 위해서 글쓴이 항목을 추가하기로 한다.

질문 부분에 author를 넣어서 진행.

  • author의 경우 회원 객체를 가지고 있어야함.
  • User의 경우 본인의 질문리스트도 알 수 있으면 좋으니 1:N 관계로 정리하자.

마찬가지로 답변을 적은 사람도 누군지 알수 있게 적기.

  • 혹시 모르는 상황인 내가 적은 답변이나 질문들을 내 정보 페이지에 만들면 좋을 거같아서 추가해보자.

Question 에 author 추가

public class Question {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "question_id")
    private Integer id;

    @Column(length = 200)
    private String subject;

    @Column(columnDefinition = "TEXT")
    private String content;

    @ManyToOne(fetch = FetchType.LAZY)
    private SiteUser author;

    private LocalDateTime createDate;

    @JsonIgnore
    @OneToMany(mappedBy = "question",cascade = CascadeType.REMOVE)
    private List<Answer> answerList = new ArrayList<>();


    public Question(String subject, String content, LocalDateTime createDate) {
        this.subject = subject;
        this.content = content;
        this.createDate = createDate;
    }
}

Answer 에도 author 추가

public class Answer {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    private Integer id;

    @Column(columnDefinition = "TEXT")
    private String content;

    @ManyToOne(fetch = FetchType.LAZY)
    private SiteUser author;

    private LocalDateTime createDate;



    @ManyToOne(fetch = FetchType.LAZY)
    private Question question;

}
글쓴이 저장하기
  • 스프링 시큐리티에서 제공하는 principal 객체를 사용
    • principal.getName() 호출시 현재 로그인한 사용자의 사용자명을 알 수 있음.
User를 조회하는 메서드를 UserService에 추가
public SiteUser getUser(String username) {
    Optional<SiteUser> siteUser = userRepository.findByusername(username);

    if (siteUser.isPresent()) {
        return siteUser.get();
    } else {
        throw new DataNotFoundException("siteUser Not found");
    }
}

로그아웃 상황에서 principal 객체가 붙어있는 메서드를 사용하게되면 당연하게도 principal 객체가 비어있기 때문에 500 에러를 내보내게된다.

  • @PreAuthorize("isAuthenticated()") 애너테이션을 통해서 로그인을 한 경우에만 작동되게 해줌으로써 principal 객체가 비어있는 상황에서 사용하지 못하게 해주도록하자.
    • 만약 로그인을 하지 않은 경우 실행하게 되면 로그인 페이지로 이동하게 된다.
@PreAuthorize("isAuthenticated()")
@PostMapping("/create")
public String questionCreate(@Valid QuestionForm questionForm,
                             BindingResult bindingResult, Principal principal) {
    if (bindingResult.hasErrors()) {
        return "question_form";
    }
    SiteUser siteUser = userService.getUser(principal.getName());
    questionService.create(questionForm.getSubject(), questionForm.getContent(), siteUser);
    return "redirect:/question/list";
}
  • question도 작성할때 현재 사용자 이름이 있어야하기 때문에 principal을 포함하고 있는 이유로 넣어줘야한다.
  • 이와 마찬가지로 답변 등록시에도 로그인이 된상태여야하기 때문에 달아줘야한다.

@PreAuthorize를 사용하려면 한가지 설정이 추가로 필요하다.

  • SecurityConfig에 밑의 애너테이션을 추가해줘야한다.

  • @EnableMethodSecurity(prePostEnabled = true)
    • 이코드를 통해서 애너테이션 기반으로 한 보안을 작동시키는게 가능해짐
    • prePostEnabled를 통해서 @PreAuthorize 와 @PostAuthorize를 사용할 수 있게 된다.
profile
열심히하자
post-custom-banner

0개의 댓글