【问题标题】:Django Rest Framework authentication - how to implement custom decoratorDjango Rest Framework 身份验证 - 如何实现自定义装饰器
【发布时间】:2014-06-30 14:35:36
【问题描述】:

我正在尝试使用 Rest Framework 实现 TokenAuthentication,但我似乎无法将我自己的自定义装饰器添加到我的 ViewSets 中,因为它们是在身份验证之前进行评估的。考虑一下:

from django.utils.decorators import method_decorator
from django.http.response import HttpResponseForbidden

def require_staff(View):
    def staffOnly(function):
        def wrap(request, *args, **kwargs):
            if request.user.is_active and request.user.is_staff:
                return function(request, *args, **kwargs)
            else:
                return HttpResponseForbidden()
        return wrap

    View.dispatch = method_decorator(staffOnly)(View.dispatch)
    return View

当我尝试实现这一点时,似乎装饰器代码首先触发,因此永远不会运行身份验证。

@require_staff
class CustomerViewSet(ModelViewSet):
    model = Customer

    filter_class = CustomerFilter
    filter_backends = (DjangoFilterBackend,)

由于 request.user 从未设置,因此引入装饰器会破坏身份验证。

我认为问题在于身份验证发生在 rest_frameworks dispatch() 函数中,如果身份验证在游戏后期完成,我不清楚如何添加额外的(比如)自定义安全性。

我在这里遗漏了什么,或者实现此自定义的正确方法是什么?

有人建议为此使用权限。我认为它们的意思是自定义 DRF 权限,对吧?

【问题讨论】:

    标签: django django-views django-rest-framework


    【解决方案1】:

    您需要知道的一切都是 DRF 权限:http://www.django-rest-framework.org/api-guide/permissions

    DRF 提供了一个与您类似的内置权限,称为IsAdminUser

    IsAdminUser 权限类将拒绝任何用户的权限, 除非user.is_staffTrue,在这种情况下将允许权限。

    此权限适用于您希望您的 API 仅可访问 给一部分受信任的管理员。

    要在基于类的视图中使用此权限:

    class ExampleView(APIView): permission_classes = (IsAdminUser,)

    现在您有两个选项可以对user.is_active 进行额外检查。

    第一个是覆盖IsAdminUser权限,像这样:

    from rest_framework import permissions
    
    class IsActiveAndAdminUser(permissions.IsAdminUser):
    """Only allow a user who is Admin and Active to view this endpoint. """
        def has_permission(self, request, view):
            is_admin = super(IsAdminAndActiveUser, self).has_permission(request, view)
            return request.user.is_active and is_admin
    

    第二个是创建一个IsActiveUser 权限,并将它们链接在你的视图中。

    IsActiveUser 权限:

    from rest_framework import permissions
    
    class IsActiveUser(permissions.BasePermission):
    """ Only Active Users have permission """
        def has_permission(self, request, view):
            return request.user.is_active
    

    您在基于类的视图中的新权限列表:

    class ExampleView(APIView): permission_classes = (IsActiveUser, IsAdminUser,)

    【讨论】:

      猜你喜欢
      • 2015-12-26
      • 2015-11-12
      • 2019-11-20
      • 1970-01-01
      • 2019-02-02
      • 2020-03-16
      • 2017-01-07
      • 2021-04-04
      • 2019-05-09
      相关资源
      最近更新 更多