12

我正在阅读http://www.django-rest-framework.org/api-guide/permissions/并尝试将其与 OAuth2 工具包文档http://django-oauth-toolkit.readthedocs.io/en相关联/latest/rest-framework/getting_started.html。后者有一个例子,其中settings.py一个指定

REST_FRAMEWORK = {
    # ...

    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    )
}

此外,IsAuthenticated还指定添加到permission_classesa 的列表中ModelViewSet

class UserViewSet(viewsets.ModelViewSet):
    permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
    queryset = User.objects.all()
    serializer_class = UserSerializer

我是否从这个示例中正确推断出DEFAULT_PERMISSION_CLASSES没有附加/附加到 aModelViewSet的权限类,而是被它替换?

4

4 回答 4

7

在 Django REST 框架中,默认权限类如何与 per-view(set) 相结合?

它们没有组合在一起。

... DEFAULT_PERMISSION_CLASSES 不是前置/后置到 ModelViewSet 的权限类,而是被它替换?

正确的。

于 2018-01-29T22:31:03.497 回答
7

我是否从这个示例中正确推断出 DEFAULT_PERMISSION_CLASSES没有附加/附加到 a ModelViewSet的权限类,而是被它替换?

DEFAULT_PERMISSION_CLASSES用于未定义的视图/视图集permission_classes。在定义它们的情况下,将使用它们,而不是默认的。

于 2018-01-29T22:31:34.293 回答
2

如果您确实想扩展默认权限,这似乎可行。

免责声明:我通过查看 DRF 的代码找到了它,但不确定它是否记录在案。

from rest_framework.settings import api_settings

class UserViewSet(viewsets.ModelViewSet):
    permission_classes = [*api_settings.DEFAULT_PERMISSION_CLASSES, TokenHasReadWriteScope]
于 2022-02-11T17:13:25.323 回答
-1

像这样在您的自定义权限类中添加代码

class ObjectWritePermission(BasePermission):
    # you will see this function in IsAuthenticated Permission class
    def has_permission(self, request, view):
        return bool(request.user and request.user.is_authenticated)

    def has_object_permission(self, request, view, obj):
        return obj.user == request.user
于 2021-10-16T15:16:47.423 回答