Permission 공부하기

이 포스트의 내용을 바탕으로 기능을 만들어보려고 한다.

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에서 제공하는 LoginViewLogoutView를 사용하기 위해 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강 로그아웃 구현하기

좋은 웹페이지 즐겨찾기