Django rest framework:防止一个用户访问 ModelViewSet 中的 deleting/Editing/Viewing 个其他用户
Django rest framework : Prevent one user from deleting/Editing/Viewing other users in ModelViewSet
我正在为我的 Django 休息框架使用 Django 用户模型。为此,我为我的用户 class.
使用了 Django 的 ModelViewSet
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
Serializers.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'username', 'password']
extra_kwargs = {
'password' : {
'write_only':True,
'required': True
}
}
def create(self, validated_data):
user = User.objects.create_user(**validated_data)
Token.objects.create(user=user) # create token for the user
return user
但目前当我使用一个用户的令牌发出请求以查看、删除、编辑其他用户时来自邮递员
http://127.0.0.1:8000/api/users/4/
它能够 edit/delete/view 其他用户。我不希望这种情况发生,一个用户只能对自己提出请求就是我想要的。
这是我的应用程序urls.py
urls.py
from django.urls import path, include
from .views import ArticleViewSet, UserViewSet
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('articles', ArticleViewSet, basename='articles')
router.register('users', UserViewSet, basename = 'users')
urlpatterns = [
path('api/', include(router.urls)),
]
如何防止一个用户在其他用户发出 GET/POST/PUT/DELETE 请求时访问其他用户。
编辑 1: 添加 IsOwnerOfObject class 后,他在下面的回答中提供了,现在当我请求用户本人的详细信息时,我得到
Authentication credentials were not provided.
创建一个名为 permissions.py
.
的文件
from rest_framework import permissions
class IsOwnerOfObject(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
return obj == request.user
接下来给你的ModelViewSet添加权限class:
from yourapp.permissions import IsOwnerOfObject
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = [IsOwnerOfObject, <other permission classes you want to use>]
如果你想完全禁用删除(这可能是正确的,因为如果你想“删除”一个用户,你应该停用它。)然后你可以用这个替换你的视图:
from rest_framework import viewsets
from rest_framework import generics
class UserViewSet(
generics.CreateModelMixin,
generics.ListModelMixin,
generics.RetrieveModelMixin,
generics.UpdateModelMixin,
generics.viewsets.GenericViewSet
):
queryset = User.objects.all()
serializer_class = UserSerializer
然后您可以使用 Ene Paul 的回答来限制可以编辑的人。
根据 Ene 的回答构建,需要提供身份验证和许可 classes。
创建一个名为 permissions.py.
的文件
from rest_framework import permissions
class IsOwnerOfObject(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
return obj == request.user
接下来将权限和身份验证class 添加到 ModelViewSet:
from api.permissions import IsOwnerOfObject
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = [IsAuthenticated, IsOwnerOfObject]
authentication_classes = (TokenAuthentication,)
我正在为我的 Django 休息框架使用 Django 用户模型。为此,我为我的用户 class.
使用了 Django 的 ModelViewSetclass UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
Serializers.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'username', 'password']
extra_kwargs = {
'password' : {
'write_only':True,
'required': True
}
}
def create(self, validated_data):
user = User.objects.create_user(**validated_data)
Token.objects.create(user=user) # create token for the user
return user
但目前当我使用一个用户的令牌发出请求以查看、删除、编辑其他用户时来自邮递员
http://127.0.0.1:8000/api/users/4/
它能够 edit/delete/view 其他用户。我不希望这种情况发生,一个用户只能对自己提出请求就是我想要的。
这是我的应用程序urls.py
urls.py
from django.urls import path, include
from .views import ArticleViewSet, UserViewSet
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('articles', ArticleViewSet, basename='articles')
router.register('users', UserViewSet, basename = 'users')
urlpatterns = [
path('api/', include(router.urls)),
]
如何防止一个用户在其他用户发出 GET/POST/PUT/DELETE 请求时访问其他用户。
编辑 1: 添加 IsOwnerOfObject class 后,他在下面的回答中提供了,现在当我请求用户本人的详细信息时,我得到
Authentication credentials were not provided.
创建一个名为 permissions.py
.
from rest_framework import permissions
class IsOwnerOfObject(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
return obj == request.user
接下来给你的ModelViewSet添加权限class:
from yourapp.permissions import IsOwnerOfObject
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = [IsOwnerOfObject, <other permission classes you want to use>]
如果你想完全禁用删除(这可能是正确的,因为如果你想“删除”一个用户,你应该停用它。)然后你可以用这个替换你的视图:
from rest_framework import viewsets
from rest_framework import generics
class UserViewSet(
generics.CreateModelMixin,
generics.ListModelMixin,
generics.RetrieveModelMixin,
generics.UpdateModelMixin,
generics.viewsets.GenericViewSet
):
queryset = User.objects.all()
serializer_class = UserSerializer
然后您可以使用 Ene Paul 的回答来限制可以编辑的人。
根据 Ene 的回答构建,需要提供身份验证和许可 classes。
创建一个名为 permissions.py.
的文件from rest_framework import permissions
class IsOwnerOfObject(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
return obj == request.user
接下来将权限和身份验证class 添加到 ModelViewSet:
from api.permissions import IsOwnerOfObject
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = [IsAuthenticated, IsOwnerOfObject]
authentication_classes = (TokenAuthentication,)