【问题标题】:Django Rest Framework - authentication_classes by method in viewsetsDjango Rest Framework - 在视图集中按方法进行身份验证类
【发布时间】:2018-06-22 01:17:33
【问题描述】:

我想在我的UserViewSet 中禁用创建时的身份验证,这样即使未经身份验证的用户也可以创建帐户。

我在我的应用程序中使用django-oauth-toolkit 进行身份验证,并且我在我的设置中使用他们的身份验证类作为默认值(这很棒)

我曾尝试使用 @authentication_class 装饰器 (https://stackoverflow.com/a/39717881/5438372),但它似乎不适用于 ModelViewSet

我还尝试覆盖get_authenticator 方法,本着与此相同的精神:Django rest framework permission_classes of ViewSet method,但ViewSet.action 似乎在身份验证时不可用。

我该怎么做?我的方法有问题吗?

这是我的代码:

<models.py:>
class UserViewSet(viewsets.ModelViewSet):
    serializer_class = UserSerializer
    permission_classes = (IsSelfOrStaffPermission, TokenHasReadWriteScope,)
    lookup_field = 'username'

    def get_queryset(self):
        current_user = self.request.user
        if current_user.is_staff:
            user_set = User.objects.all()
        else:
            user_set = User.objects.filter(username=current_user.username)

        query = self.request.query_params.get('q', None)

        if not query:
            return user_set

        return user_set.filter(
            Q(username__icontains=query) |
            Q(first_name__icontains=query) |
            Q(last_name__icontains=query)
        )

<settings.py:>
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'oauth2_provider.contrib.rest_framework.OAuth2Authentication',
    ),

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

<permission.py:>
class IsSelfOrStaffPermission(permissions.BasePermission):
    """
    Permission to allow user actions on his own profile
    """
    def has_object_permission(self, request, view, obj):
        return obj == request.user or request.user.is_staff

【问题讨论】:

    标签: python django oauth-2.0 django-rest-framework


    【解决方案1】:

    您可以检查view.action 是否在has_permission 方法中“创建”:

    class IsSelfOrStaffPermission(permissions.BasePermission):
        """
        Permission to allow user actions on his own profile
        """
        def has_permission(self, request, view):
            return view.action == 'create'
    

    【讨论】:

    • 我认为问题无法在权限级别解决,但您的回答给了我这个想法。解决方案是覆盖TokenAsReadWriteScopehas_permission方法
    猜你喜欢
    • 2013-12-29
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 2013-05-03
    相关资源
    最近更新 更多