이 포스트의 내용을 바탕으로 기능을 만들어보려고 한다.
django에서 권한에 대한 기본적인 기능들을 제공하고 있다고 나와있다.
is_superuser
$ create superuser
로 생성한 user에 대해 =Ture
로 설정된다is_superuser=True
인 경우 permission을 주지 않아도 모든 권한을 가진다is_staff
=True
로 설정할 경우 admin 페이지(관리자 페이지)에 접속할 수 있다is_active
=False
일 경우 그 어떠한 권한도 주어지지 않는다Permission(권한)에는 어떤 종류가 있는지 먼저 알아봐야겠다.
django REST framework(이하 DRF)을 사용하기 때문에, 여기서 제공하는 Permission에는 어떤 것이 있는지 보겠다.
AllowAny
(기본값): 인증 여부를 묻지 않고 해당 view의 호출을 허용한다isAuthenticated
: 인증된 요청에 한하여 view의 호출을 허용한다isAdminUser
: staff로 인증된 요청에 한하여 view의 호출을 허용한다isAuthenticatedOrReadOnly
: 인증되지 않은 요청에 대해서는 읽기 권한만 주어진다DjangoModelPermissions
: 인증된 사용자의 요청에 한하여 view 호출을 허용하고 유저별 인증&권한 확인을 수행한다DajngoModelPermissionsOrAnonReadOnly
: 위와 비슷하나 인증되지 않은 요청에 대해서는 읽기 권한 주어진다DjangoObjectPermissions
: 인증되지 않은 요청을 거부하며 레코드에 대한 인증된 접근이 권한을 가지고 있는지를 확인한다이제 이러한 권한을 지정하는(부여하는) 작업을 해볼 차례다.
APIView
에서는 permission_classes
를 통해 권한 지정을 할 수 있다고 설명되어 있다.
APIView
를 상속받은 Viewset
또한 동일하게 기능을 구현할 수 있다.
내가 보면서 배우고 있는 이 포스트의 views.py
내용을 응용하여, 이전 프로젝트에서 사용했던 코드를 수정&추가하는 것이 좋아보인다.
모델은 이걸 사용하고
# models.py
# 이두 운동 관련된 모델
class BicepsCurl(models.Model):
username = models.ForeignKey(User, on_delete=models.CASCADE)
count = models.IntegerField()
...
...
class Meta:
ordering = ['created']
ModelViewSet
을 사용하여 그 안에 permssion_classes
를 사용할 것임.
# views.py
class BicepsViewSet(ModelViewSet):
queryset = BicepsCurl.objects.all
serializer_class = BicepsSerializer
permission_classes = [
IsAuthenticated,
]
이렇게 해놓은 걸 urls.py에 추가해준다.
# urls.py
from django.contrib.auth import views as auth_views
path('bicepview/', views.BicepsViewSet.as_view(), name='BicepsViewSet'),
path('login/', auth_views.LoginView.as_view(), name='login'),
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
auth_views
는 django에서 제공하는 LoginView
와 LogoutView
를 사용하기 위해 import 해놓은 것이다. import 시에 views
와의 충돌을 막기 위해 auth_views
라는 이름으로 import하였다.
이렇게 해놓고 Insonmia로 /bicepsview
주소부터 무작정 접속을 해보려고 했다.
그런데
$ python manage.py runserver
에서부터 에러가 났다!
요러요러한 에러 내용을 볼 수가 있는데..
The `actions` argument must be provided when calling `.as_view()` on a ViewSet. For example `.as_view({'get': 'list'}
그럼 일단 다른 것부터 해본다.
path('bicepview/', views.BicepsViewSet.as_view(), name='BicepsViewSet'),
를 주석처리하고 $ runserver
를 해보니 서버가 올라간다.
/login
에 로그인 요청을 해본다.오랜만에 403 Forbidden
을 보게 되었다.
Web이었다면 템플릿(*html)으로 form을 작성하고 그 안에 {% csrf_token %}
을 붙여주는 것으로 문제를 해결할 수 있을 것 같다. 그런데 App 또는 그 수준의 외부에서 어떤 요청을 보낼 때 csrf_token
을 어떻게 해야할지 잘 모르겠다.
BicepsViewSet
에서 발생한 에러도 form에서라면 action=
을 명시해줘서 해결 할 수 있을 것 같다.
으아 머리가 아프다.
간단한 web을 하나 구축해서 이쪽을 다시 시도해봐야겠다.
[Django] Authentication 과 Permissions
[Django Rest Framework] ModelViewset 동작에 대해 (queryset, get_object)
Django CSRF 쿠키가 설정되지 않음
stackflow: The actions argument must be provided...
4강 로그아웃 구현하기