[django] 인증시스템구축

Hyeseong·2020년 12월 13일
1

django

목록 보기
6/35

목적

: 기존 소스코드에 대한 버그 fixing을 진행하고 어떤 유저가 get방식으로 다른 유저의 프로필 화면, 수정, 삭제 url 페이지에 접근하지 못하도록 소스코드를 짜보도록 할게요.

bug fixing

view

views.py에 가서 버그 fixing을 진행해볼게요.

AccountUpdateView, AccountDeleteView 안에 context_object_name을 'target_user'로 입력하도록 할게요.

class AccountUpdateView(UpdateView):
    model = User
    context_object_name = 'target_user'
    form_class = AccountUpdateForm
    success_url = reverse_lazy('accountapp:hello_world')
    template_name = 'accountapp/update.html'


class AccountDeleteView(DeleteView):
    model = User
    context_object_name = 'target_user'
    success_url = reverse_lazy('accountapp:logi

template

delete.html, update.html 안에서 user.pk를 target_user.pk로 변경합니다.

프로젝트 urls.py

path('account/', )를 복수형 accounts로 변경합니다.


첫 번째 인증

사용자가 로그인 했으면 accounts/hello_world/를 접속할 수 있지만 만약 로그인 하지 않았다면 login페이지를 던져주게 되요.
그럼 로그인 되어 있지 않다면 로그인 창으로 되돌려 줘야 겠조?

단계

  • view의 hello_world메서드 안에 `if request.user.is_authenticated:를 처음 씌워줌.
  • 로그인 되어 있지 않다면 else문으로 return HttpResponseRedirect(reverse('accountapp:login')) 로그인 페이지로 redirect해줌.

views.py

def hello_world(request):

    if request.user.is_authenticated: # 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/helloworld.html', context={'hello_world_list':hello_world_list})
    else:
        return HttpResponseRedirect(reverse('accountapp:login'))

두 번째 단계

로그인 하지 않았는데 개인 프로필 수정 화면에 진입되면 안되겠조?

부모 클래스의 UpdateView클래스의 다시 부모 클래스인 BaseUpdateView의 get(), post()메서드를 가져와서 커스터마이징하여 인증 소스코드를 짜보도록 할거에요.

self.request.user.is_authenticated 로그인 단순 유무를 물어 보는 것이며,
self.get_object() == self.request.user get_object()메서드를 통해서 pk, slug 값이 == self.request.user의 값 여기선 pk이겠조? 해당 값과 동일한지 조건을 따지게 됩니다.
그럼 정상적으로 부모클래스의 메소드를 호출하고 return하여 돌려주게되요.

위 and키워드 양쪽 어디에도 해당되지 않을 경우 1) 로그인 X, 2) 로그인 했더라도 다른 유저라면 HttpResponseForbidden()클래스를 호출하여 웹페이지에 404 오류를 띄우게되요.


class AccountUpdateView(UpdateView):
    ...
    ...
    ...
    
    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()

get방식에 대한 처리가 이루어 졌는데, post방식도 동일하게 1)로그인 X, 2) 다른 로그인 유저가 접근하지 못하게 조치를
취하려면 동일한 소스코드를 적용하면 되요.


    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()

자! 그럼, 어떤 유저의 프로필 update 화면을 수정했습니다.
또 계정 삭제를 위한 화면 역시 get, post 방식을 처리해야 해요.

그렇다면 유저 정보를 단순히 불러오는(입력X) 화면도 get, post 방식으로 접급하지 못하도록 인증 처리를 해야겠조?
아니조

detail 화면의 경우 POST방식으로 처리되는 입력이 없기에 get메서드만 정의하면 되요.

profile
어제보다 오늘 그리고 오늘 보다 내일...

0개의 댓글