개발하는 자몽

[Spring Security] @PreAuthorize 본문

Java/Spring

[Spring Security] @PreAuthorize

jaamong 2023. 1. 5. 10:21

권한에 따른 페이지처리를 하고 싶다면 Principal 객체를 사용하는 메서드 위에 @PreAuthorize("isAuthenticated()") 어노테이션을 사용하면 된다.

Principal 객체를 사용하는 메소드에서 사용하지 않으면 500 에러가 발생한다. 이 오류는 Principal 객체가 널(null)값이라서 발생한 오류이다(콘솔을 확인하면 NPE가 반겨줄거다). Principal 객체는 로그인을 해야만 생성되는 객체이기 때문이다.

▶ isAuthenticated() : 로그인 → true  |  로그아웃 → false

 

나의 경우 "로그인을 해야 게시글 또는 댓글을 달 수 있게 하고, 로그아웃 상태라면 로그인 페이지로 이동"하게 하고싶었다. 해당 따라서 해당 어노테이션을 적용하여 메서드가 실행되기 전 권한을 확인했다. 

 

    @PreAuthorize("isAuthenticated()")
    @GetMapping("/create")
    public String questionCreate(QuestionForm questionForm) {
        return "question_form";
    }

    @PreAuthorize("isAuthenticated()")
    @PostMapping("/create")
    public String questionCreate(@Valid QuestionForm questionForm,
                                 BindingResult bindingResult,
                                 Principal principal) {
        if (bindingResult.hasErrors()) return "question_form";

        SiteUser user = userService.getUser(principal.getName());
        questionService.create(questionForm.getSubject(), questionForm.getSubject(), user);

        return "redirect:/question/list";
    }

 

그리고 @PreAuthorize 어노테이션이 동작할 수 있도록 SecurityConfig에 @EnableMethodSecurity(prePostEnabled = true)를 적용해야 한다.

@Configuration
@EnableWebSecurity
@EnableMethodSecurity(prePostEnabled = true) //@PreAuthorize 동작
public class SecurityConfig {

 ...
 
}

 

 

 

 

 

참고

 

3-08 엔티티 변경

* `[완성 소스]` : [https://github.com/pahkey/sbb3/tree/3-08](https://github.com/pahkey/sbb3/tree/3-08) …

wikidocs.net

Comments