Django 17

‍박태우·2023년 5월 13일
0
post-custom-banner

버그 수정

  • 강의 듣기에 앞서 bug fix를 아래와 같이 진행하였다.

(updateview와 deleteview에 target_user를 추가하였다.)

(위의 delete.html 또한 pk=user.pk -> pk=target_user.pk 로 수정)

(위의 update.html 또한 pk=user.pk -> pk=target_user.pk 로 수정)

user = 현재 접속한 자신
target_user = 페이지 주인

  • 아래와 같이 detail.html에 조건문으로 updateview와 deleteview에 대한 접근 식이 있기 때문에 바꿔 준듯.

#Authentication 인증 시스템 구축

-- 인증 과정을 만들어 보자!!

  • hello_world 함수에 인증하는 기능을 추가해보는 과정

(사용자가 인증을 했으면 정상적으로 접근 하지만 아닌 경우 로그인 창으로 되돌려 보내주는 코드이다. if else 문을 추가하여 구현하였으며 로그인이 되지 않은 경우 login 으로 이동하라는 문구 까지 else 문에 추가하였다.)

결과 :

(주소 창에 accounts/hello_world 로 접속하여도 위와 같이 /login으로 연결된다.)

=> hello_world.html 뿐만 아니라 다른 view 에 대해서도 로그인이 되었을 때만 접속허가 하도록 만들어 보자

(로그아웃인 상태이지만 정보 수정 페이지로 들어 올 수 있는 문제가 발생)



  • 해결
    (하지만 이것은 올바른 방법이 아니다. 임시적인 해결법, 나중에 수정 예정)

=> UpdateView 클래스 안에는 get이라는 함수(메소드)가 존재, 이를 통해 get 내부의 행동을 지정 가능하다.

(updateview에 get,post 함수를 재정의 한 모습.

if,else 문이 없으면 원래 존재하는 함수와 동일한 기능을 하나, 인증 되었을 때는 get,post 함수 원형 대로 행동.

하지만 로그인 인증이 되지 않은 경우 login 페이지로 이동하라는 명령을 수행한다.

똑같은 코드를 AccountDetailView에도 적용 하였다.)

(제 아무리 주소창을 통해 updateview나 detailview에 접근 하려고 해도 login 창이 뜨는 것을 확인 할 수 있다.)

! 문제점 발생 :

저 상태 에서 로그인을 하고 주소창을 이용하여 다른 사람의 detail, delete, update에 마음대로 접근 가능하다는 문제점이 발생한다.
실제로 delete 를 이용하여 계정 삭제도 다른 계정에서 가능하다는 문제 발생



==> 해결하기 :

(self 는 자기 자신의 view를 가리킨다. self.get_object()는 이 view 안에서 현재 사용되고 있는 user object 중에서도 url.py에 있는 pk를 가져와 그에 해당하는 object를 가져온다.

그것이 지금 request를 보내고 있는 유저와 동일한지 확인하는 과정이 필요 함. 그것이 위에 추가한 코드이다.)

(현재 로그인한 계정에서 다른 계정의 pk를 이용하여 정보에 접근하려고 하면 로그인 페이지로 이동하는 모습을 볼 수 있다.)



=> 수정 : 다른 계정에 무단으로 접근하려고 하면 로그인 페이지가 아닌 금지 되었다는 것을 보여주는 페이지로 이동하도록
아래와 같이 수정하였다.

(위와 같이 DeleteView 뿐만 아니라 DetailView, UpdateView에도 동일하게 적용하였다.)

(결과 : 거부되었다는 페이지가 출력된다.)

=> 이런 식으로 코드를 수정해보았지만 코드가 너무 복잡하고 가독성이 떨어지는 단점이 있음

다음 시간에 Decorater를 이용하여 간단화 할 것이다.

profile
잘 부탁드립니다.
post-custom-banner

0개의 댓글