• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

다른 사용자가 수정페이지에 접근하는 걸 막으려면 어떻게 하나요?

20.12.16 20:31 작성 조회수 77

0

다른 사용자가 게시물 수정 페이지에 접근하는걸 막으려면 어떻게 해야 하나요?

로그인을 안한 사용자가 접근하는 건 뷰에 LoginRequiredMixin을 사용해서 막는데, 로그인은 했지만 작성자가 아닌 사용자가 접근하는 건 어떻게 막나 궁금합니다.

PostUpdate 뷰를 아래처럼 수정해봤지만 form_valid가 템플릿을 생성한 후에 실행되는 건지 리다이렉트가 안됩니다.

# /blog/post.pk/update/ GET
class PostUpdate(LoginRequiredMixin, UpdateView):
model = Post # 템플릿: post_form
fields = ['title', 'content', 'head_image', 'category', 'tags']

def form_valid(self, form):
current_user = self.request.user

pk = self.kwargs['pk']
current_post = Post.objects.get(pk=pk)

#
if current_user is current_post.author:
return super(type(self), self).for_valid(form)
else:
return redirect('/blog/1/')

다른 사용자의 접근을 막는 방법과 form_valid가 언제 실행되는지 알려주시면 감사하겠습니다.

답변 1

답변을 작성해보세요.

1

아래와 같이 dispatch를 추가해보세요. 

dispatch() 메서드는 방문자가 웹 사이트 서버에 GET 방식으로 요청했는지 POST 방식으로 요청했는지 판단하는 기능을 합니다. CreateView나 현재 사용하고 있는 UpdateView의 경우 방문자가 서버에 GET 방식으로 들어오면 포스트를 작성할 수 있는 폼 페이지를 보내줍니다.

만약 권한이 없는 사용자가 PostUpdate를 사용하려고 한다면 서버와 통신하는 방식이 GET방식이든 POST 방식이든 상관없이 접근할 수 없게 해야 합니다. 따라서 dispatch()가 실행될때  작성자인지 확인하면 됩니다. 작성자가 아니라면 "권한없음"오류를 나타냅니다. 

from django.core.exceptions import PermissionDenied

(생략)

class PostUpdate(LoginRequiredMixin, UpdateView):
    model = Post
    fields = [‘title’, ‘hook_text’, ‘content’, ‘head_image’, ‘file_upload’, ‘category’, ‘tags’]

    def dispatch(self, request, *args, **kwargs):
        if request.user.is_authenticated and request.user == self.get_object().author:
            return super(PostUpdate, self).dispatch(request, *args, **kwargs)
        else:
            raise PermissionDenied

(생략)