Backend/Django

django 15. Authentication 인증시스템 구축

meong_j 2021. 10. 6. 14:36
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 페이지로 이동이 거부됨
반응형