TIL최종프로젝트(3) permission, is_admin, is_superuser

2023. 6. 8. 22:37TIL/2023.6월

2023.06.08 목

 

문제

관리자만, 행사 정보를 생성할 수 있게 하려고 permission을 주었지만, 잘 작동되지 않는 문제가 발생하였습니다.

 

class CustomPermission(permissions.BasePermission):
    """
    읽기 권한은 비로그인, 로그인 일반 회원 모두에게 주어집니다.
    생성, 수정, 삭제 권한은 오직 admin에게만 주어집니다.
    권한이 없을 경우 "권한이 없습니다" 메시지와 함께 상태메시지 403 에러를 발생시킵니다.
    """

    message = "권한이 없습니다"

    def has_permission(self, request, view):
        if request.method in permissions.SAFE_METHODS:
            return True
        else:
            return request.user.is_superuser

 

시도

관리자와 일반 회원, 비회원을 구분하는 permission을 처음 작성해 보았기에 permission을 사용하여 구분하지 못한다고 생각하여 drf 공식문서를 찾아보았습니다.

IsAdminUser

 

Permissions - Django REST framework

 

www.django-rest-framework.org

IsAdminUser를 사용하여 admin에게만 권한을 부여할 수 있다는 것을 알게되었습니다.

하지만, 읽기 권한을 위해 IsAuthenticatedOrReadOnly와 함께 사용해보기위해 시도하였지만, 불가능했습니다.

 

해결

is_superuser을 is_admin으로 변경하였더니 잘 작동되었습니다.
db자체에 user가 저장될 때, is_superuser필드가 없고 is_admin만 존재한다는 것을 확인하였습니다.

class CustomPermission(permissions.BasePermission):
    """
    읽기 권한은 비로그인, 로그인 일반 회원 모두에게 주어집니다.
    생성, 수정, 삭제 권한은 오직 admin에게만 주어집니다.
    권한이 없을 경우 "권한이 없습니다" 메시지와 함께 상태메시지 403 에러를 발생시킵니다.
    """

    message = "권한이 없습니다"

    def has_permission(self, request, view):
        if request.method in permissions.SAFE_METHODS:
            return True
        else:
            return request.user.is_admin

 

느낀점

이전에 request.user라고 사용해야하는 부분을 request.author로 사용하여 비슷한 문제가 발생했었던 일이 있었습니다.

조금만 더 생각했더라면, 쉽게 해결했을거고, 어쩌면, 문제를 만나지 않았을 수도 있습니다.

 이런 부분에서 좀 더 유연한 사고가 필요하다 생각합니다.