Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django rest framework 一个用户登录,另一个用户的accesstoken_Django Rest Framework_Django Rest Framework Simplejwt - Fatal编程技术网

Django rest framework 一个用户登录,另一个用户的accesstoken

Django rest framework 一个用户登录,另一个用户的accesstoken,django-rest-framework,django-rest-framework-simplejwt,Django Rest Framework,Django Rest Framework Simplejwt,我已经为基于令牌的身份验证实现了simpleJWT。我创建了一个简单的hello world测试API 在测试过程中,我使用/rest auth/login/和来生成use/api/token/,这两种方法都可以正常工作 现在,为了进行测试,我使用用户XYZ(拥有helloworld api的访问权限)登录,并使用另一个用户ABC(没有helloworld api的访问权限)生成令牌 所以现在用户XYZ已通过身份验证(ok),但我拥有用户ABC(ok)的令牌 现在,当我使用为使用ABC生成的令牌

我已经为基于令牌的身份验证实现了simpleJWT。我创建了一个简单的hello world测试API

在测试过程中,我使用/rest auth/login/和来生成use/api/token/,这两种方法都可以正常工作

现在,为了进行测试,我使用用户XYZ(拥有helloworld api的访问权限)登录,并使用另一个用户ABC(没有helloworld api的访问权限)生成令牌

所以现在用户XYZ已通过身份验证(ok),但我拥有用户ABC(ok)的令牌

现在,当我使用为使用ABC生成的令牌调用API时,我能够访问helloworld API,即使用户ABC没有API的权限!!因为已经登录了具有权限的用户XYZ

问题是,当多个用户使用该站点时,情况总是如此。如何解决?下面还提供了一些代码片段:

我的设置被剪掉了

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',

    ),
}
代码基本上是为用户进行身份验证的装饰器,如下所示

def user_is_ADM(fun_c):
    @wraps(fun_c)
    def wrapped(request, *args, **kwargs):
        # 1 = ADM
        if(request.user and request.user.is_authenticated) :   <--- here is the issue
            user_data = UserProfile.objects.get(user_id = request.user.id)

           # user profile as as a user type
            u = user_data.user_type
            if  u == 1:
                return fun_c(request, *args, **kwargs)
            else:
                raise PermissionDenied
    return wrapped

签出此文档(自定义权限)

设置常规权限设置时(已验证)。 它实际上是在验证用户,而不是在任何时候验证他们的权限

class IsAuthenticated(BasePermission):
    """
    Allows access only to authenticated users.
    """

    def has_permission(self, request, view):
        return bool(request.user and request.user.is_authenticated)
如果基本的管理员和用户身份验证还不够。您可以实现自定义权限

from rest_framework import permissions

class CustomerAccessPermission(permissions.BasePermission):
    """
    extracted from the documentation
    """
    message = 'Adding customers not allowed.'

    def has_permission(self, request, view):
        """
        add authentication logic and return a boolean value
        """
        # ...
        # return bool()
在视图中

from rest_framework.views import APIView
from modulename.permissions import CustomerAccessPermission

class ExampleView(APIView):
    """
    ...
    """
    permission_classes = (CustomerAccessPermission,)

    def get(self, request, format=None):
        """
        ...
        """
下面是一个具有django身份验证权限的示例

from typing import Tuple
from rest_framework.permissions import BasePermission

class CustomPermission(BasePermission):
    """
    ...
    """
    list_permissions: Tuple[str] = (
        'modelname.view_modelname',
        'modelname.add_modelname',
        'modelname.change_modelname',
        'modelname.delete_modelname',
    )

    def has_permission(self, request, view) -> bool:
        return bool(
            request.user.has_perms(self.list_permissions)
            or
            request.user and request.user.is_staff
            or
            request.user and request.user.is_superuser
        )
总结

一般来说,关于语法,您不会看到任何更改,您必须在视图中导入您的权限或decorator,区别在于运行时和django评估权限的方式

from typing import Tuple
from rest_framework.permissions import BasePermission

class CustomPermission(BasePermission):
    """
    ...
    """
    list_permissions: Tuple[str] = (
        'modelname.view_modelname',
        'modelname.add_modelname',
        'modelname.change_modelname',
        'modelname.delete_modelname',
    )

    def has_permission(self, request, view) -> bool:
        return bool(
            request.user.has_perms(self.list_permissions)
            or
            request.user and request.user.is_staff
            or
            request.user and request.user.is_superuser
        )
记住,decorator只不过是表示func(func())的一种概括方式。 因此,您应该始终评估视图并调用由装饰程序修改的方法

相反,此框架中的权限始终定义为权限类列表。在执行视图主体之前,将验证列表中的每个权限。如果任何权限验证失败,将生成异常。拒绝许可或例外。将生成未经验证的异常,并且不会执行视图的主体。(有关完整的解释,请参阅文档)

您应该评估哪种方法最适合您的情况(性能、语法等)


但我必须再次在permission.py中添加与decorator相同的修改逻辑(我已经为decorator的新版本编辑了我的问题)。使用decorator验证与权限相同的东西有什么区别?请详细说明或指导/解释更新答案,我希望我的解释对您有所帮助。但是如何为用户分配权限?我建议阅读此文档。它包含了一个很好的解释和例子,你可以运行。用户有分配权限的方法(myuser.user\u permissions.set([permission\u instances\u list])。django为每个模型生成默认权限(查看、更改、删除、创建)。您还可以在组级别(myuser.groups.set([group\u instances\u list])工作
# you can set your permission in the general settings to avoid importing into each file
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'modulename.permissions.CustomPermission',
    ),
    # ...
}