meong_j
기록하는 습관.
meong_j
전체 방문자
오늘
어제
  • 분류 전체보기 (176)
    • 개인 공부 정리 (0)
    • 서버 운영 (37)
      • Linux (36)
    • Frontend (11)
      • Vue.js (10)
    • Backend (70)
      • Java (4)
      • Python (22)
      • Django (38)
      • Spring (6)
    • Database (5)
      • Oracle (4)
      • MySQL (1)
      • MariaDB (0)
    • Android (14)
      • Kotlin (6)
    • 배포 (9)
      • Docker (8)
      • AWS (1)
    • IT_study (29)
      • Coding test (17)
      • 알고리즘 (5)
      • 스터디 (6)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • github

인기 글

반응형

태그

  • 리눅스인증
  • 안드로이드adaptor
  • 중첩라우트
  • dp #알고리즘
  • Kotlin
  • 테크커리어
  • router-link
  • dockersecret
  • Proxy
  • DHCP
  • 개발자도서
  • 리눅스방화벽
  • 배포인프라
  • SASS Variables
  • gabagecollecter
  • django
  • 이차원배열정렬
  • 코틀린자료형
  • cpu사용률
  • docker

최근 댓글

최근 글

250x250
hELLO · Designed By 정상우.
meong_j

기록하는 습관.

django 15. Authentication 인증시스템 구축
Backend/Django

django 15. Authentication 인증시스템 구축

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 페이지로 이동이 거부됨
반응형

'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
    'Backend/Django' 카테고리의 다른 글
    • django 17. superuser, media 관련 설정
    • django 16. Decorator를 이용한 코드 간소화
    • django 14. DeleteView 기반 회원탈퇴 구현
    • django 13. UpdateView를 이용한 비밀번호 변경 구현
    meong_j
    meong_j
    #it #개발일기 #개발공부 #개발자 #백앤드 #생각정리 #시간은 실력에 비례한다 #뭐든지 꾸준히 열심히 #오늘의 내가 내일의 나를 만든다

    티스토리툴바