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 |