リソース「ユーザー」にアクセスするために Django REST Framework を使用しています。
ユーザー情報は個人的なものであるため、管理者でない限り、GET リクエストでシステム上のすべてのユーザーを一覧表示することは望ましくありません。
ユーザーがIDを指定してログインしている場合、必要に応じて詳細を表示して修正(PUT POST DELETE)できるようにしたいと思います。
要約すると、管理者以外のユーザーには GET メソッドを許可せず、ログインしているユーザーの情報を表示するときに GET POST DELETE PUT を許可します。
カスタム権限クラスを作成しました:
class UserPermissions(permissions.BasePermission):
"""
Owners of the object or admins can do anything.
Everyone else can do nothing.
"""
def has_permission(self, request, view):
# if admin: True otherwise False
def has_object_permission(self, request, view, obj):
# if request.user is the same user that is contained within the obj then allow
これはうまくいきませんでした。has_permission
いくつかのデバッグの後、最初にチェックし、次にチェックすることがわかりましたhas_object_permission
。したがって、最初のハードル GET を乗り越えなければ/user/
、次の GET も考慮されません/user/id
。
これを機能させるにはどうすればよいですか?
私はModelViewSetsを使用していました。
ただし、リスト機能を詳細と分割すると、それらに個別のアクセス許可クラスを与えることができます。
class UserList(generics.ListCreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes=(UserPermissionsAll,)
class UserDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes=(UserPermissionsObj,)
class UserPermissionsAll(permissions.BasePermission):
"""
Owners of the object or admins can do anything.
Everyone else can do nothing.
"""
def has_permission(self, request, view):
if request.user.is_staff:
return True
else:
return False
class UserPermissionsObj(permissions.BasePermission):
"""
Owners of the object or admins can do anything.
Everyone else can do nothing.
"""
def has_object_permission(self, request, view, obj):
if request.user.is_staff:
return True
return obj == request.user