728x90
    
    
  반응형
    
    
    
  ※ Point
- 자신의 user페이지가 아닌 다른 user URL로 접근 가능한 문제 발생
- 아무나 접근 할 수 없도록 인증하는 Account app 생성함
- Decolator 미사용 했을 경우의 인증 과정
views.py
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django.http import HttpResponseRedirect, HttpResponseForbidden
from django.shortcuts import render
# Create your views here.
from django.urls import reverse, reverse_lazy
from django.views.generic import CreateView, DetailView, UpdateView, DeleteView
from accountapp.models import HelloWorld
from accountapp.forms import AccountUpdateForm
def hello_world(request):
    # 로그인된 유저만 접근가능하도록 추가
    if request.user.is_authenticated:
        if request.method == "POST":
            temp = request.POST.get('hello_world_input')
            new_hello_world = HelloWorld()
            new_hello_world.text = temp
            new_hello_world.save()
            return HttpResponseRedirect(reverse('accountapp:hello_world'))
        else:
            hello_world_list = HelloWorld.objects.all()
            return render(request, 'accountapp/hello_world.html', context={'hello_world_list': hello_world_list})
    else:
        return HttpResponseRedirect(reverse('accountapp:login'))
class AccountDetailView(DetailView):
    model = User
    context_object_name = 'target_user'
    template_name = 'accountapp/detail.html'
    # 로그인된 유저만 접근가능하도록 추가
    def get(self, *args, **kwargs):
        if self.request.user.is_authenticated and self.get_object() == self.request.user:
            return super().get(*args, **kwargs)
        else:
            return HttpResponseForbidden()
    def post(self, *args, **kwargs):
        if self.request.user.is_authenticated and self.get_object() == self.request.user:
            return super().post(*args, **kwargs)
        else:
            return HttpResponseForbidden()
class AccountUpdateView(UpdateView):
    model = User
    context_object_name = 'target_user'
    form_class = AccountUpdateForm # 수정한 form으로 변경
    success_url = reverse_lazy('accountapp:hello_world')
    template_name = 'accountapp/update.html'
    # 로그인된 유저만 접근가능하도록 추가
    def get(self, *args, **kwargs):
        if self.request.user.is_authenticated and self.get_object() == self.request.user:
            return super().get(*args, **kwargs)
        else:
            return HttpResponseForbidden()
    def post(self, *args, **kwargs):
        if self.request.user.is_authenticated and self.get_object() == self.request.user:
            return super().post(*args, **kwargs)
        else:
            return HttpResponseForbidden()
class AccountDeleteView(DeleteView):
    model = User
    context_object_name = 'target_user'
    success_url = reverse_lazy('accountapp:login')
    template_name = 'accountapp/delete.html'
    # 로그인된 유저만 접근가능하도록 추가
    def get(self, *args, **kwargs):
        if self.request.user.is_authenticated and self.get_object() == self.request.user:
            return super().get(*args, **kwargs)
        else:
            return HttpResponseForbidden()
    def post(self, *args, **kwargs):
        if self.request.user.is_authenticated and self.get_object() == self.request.user:
            return super().post(*args, **kwargs)
        else:
            return HttpResponseForbidden()
request.user.is_authenticated
- 로그인된 user만 접근 가능하도록 설정
self.request.user.is_authenticated and self.get_object() == self.request.user
- self.get_object의 self는 자체 View인 AccountUpdateView를 가리킴
- 해당 url의 pk 값인 object를 가져옴 ex) update/<int:pk>
- 해당 user와 현재 request된 user가 같은지 비교
HttpResponseForbidden()
- 금지된 곳에 접근할 경우 forbidden 페이지로 return

- pk=3 인 user로 로그인했을 때 화면

- url주소를 pk=4로 들어갔을 경우 403 Forbidden 페이지로 이동이 거부됨
반응형
    
    
    
  'Backend > Django' 카테고리의 다른 글
| django 17. superuser, media 관련 설정 (0) | 2021.10.06 | 
|---|---|
| django 16. Decorator를 이용한 코드 간소화 (0) | 2021.10.06 | 
| django 14. DeleteView 기반 회원탈퇴 구현 (0) | 2021.10.06 | 
| django 13. UpdateView를 이용한 비밀번호 변경 구현 (0) | 2021.10.06 | 
| django 12. DetailView 를 이용한 개인 페이지 구현 (0) | 2021.10.05 | 
