我想要构建一个具有字段级权限的API。我从数据库表中获得了这些权限,但是在REST框架中,检查用户是否可以对对象的字段执行CRUD操作的地方在哪里呢?
database --- model ---- ModelSerializer ---- ModelViewSet --- browser
在ModelSerializer?在这里,我可以在字段到达视图集之前删除它们,但是默认情况下我没有访问request.user的权限,所以我必须实现它,这是可以实现的,但是不能很好地与我拥有的其他第三方库(django-rest-swagger)一起工作。
还是在ModelViewset?在其中,我可以覆盖列表、创建、更新和销毁方法,以删除用户无法访问的字段。但是,这与我的元数据实现不太好,因为它直接从序列化程序获取元数据。
或者两者都有?当模型被序列化程序获取时,删除不允许在序列化程序中的读,然后在它们被传回序列化程序之前在视图集中删除不允许的写?
发布于 2015-09-10 09:30:10
DRF文档中有一个很好的关于权限这里的部分。一个处理(并检查它们)的好地方是在视图集中。要从文档中复制一个示例:
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
class ExampleView(APIView):
permission_classes = (IsAuthenticated,)
def get(self, request, format=None):
content = {
'status': 'request was permitted'
}
return Response(content)
如果希望具有自定义权限检查器,可以定义自己的权限检查器,并使用自己的类指定替换IsAuthenticated
。
发布于 2015-09-10 09:35:50
可以根据特定请求所需的字段创建不同的序列化程序。然后,您需要在视图中重写get_serializer_class()
函数,并根据您的逻辑决定序列化程序。
根据get_serializer_class()
上的DRF文档
可以重写以提供动态行为,例如使用不同的序列化程序进行读和写操作,或向不同类型的用户提供不同的序列化程序。
例如:
class MyView(..):
def get_serializer_class(self):
if self.request.user.is_staff: # check if staff user
return FullAccountSerializer
return BasicAccountSerializer
...
发布于 2015-09-10 10:15:33
如果要实现自定义权限,请在DRF中很好地使用modelviewset。
from rest_framework import status, viewsets
class MyModelViewsets(viewsets.ModelViewSet):
queryset = # queryset
serializer_class = # serializer class
permission_classes = (# custom permission class her)
如果希望对所有端点应用自定义权限,请在settings.py中指定
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
# add custom permission here
]
}
https://stackoverflow.com/questions/32502554
复制