如何限制 Django REST API 只有一个用户?

How to limit Django REST API to only ONE user?

我正在使用 Django 编写 REST API,我需要将一些 URL 限制为仅供其创建者使用。我实际上使用的是身份验证令牌,但实际上任何拥有令牌的人都可以使用我的 API 因此我需要将某些功能限制为特定用户。

举个例子:

Jonh Doe Token: roh2938rhe63eh0832yey3289
public --> domain.com/api/bobby/public/
public --> domain.com/api/jonhdoe/public/
private --> domain.com/api/jonhdoe/private/

并且不知何故只有 Jonh Doe 应该可以访问那个私有 URL 即使返回的数据与往常一样,但只是私有的。

每个用户都应该有自己唯一的身份验证令牌。允许某些用户访问的方法是创建权限。 Django 中的权限用于验证用户是否有权执行某些操作。 Django 创建权限的方法是在相关应用程序文件夹中创建 permissions.py 文件,在该文件中,您应该编写继承 permissions.BasePermission class 并覆盖 has_permission 的权限 class方法 returns True 如果用户应该有权限或 False 否则。这样做之后,您只需将您的权限 class 添加到 permission_classes.

的列表中

permissions.py

from rest_framework import permissions


class IsPrivateAllowed(permissions.BasePermission):
    """
    Allow access to request owner
    """
    def has_permission(self, request, view):
        # return True if allowed else False
        # 'username' is the request url kwarg eg. bobby, jonhdoe
        return view.kwargs.get('username', '') == request.user.username

我们已经创建了 IsPrivateAllowed 权限。对于您的示例,您应该检查请求令牌是否与 url 中的名称参数兼容。现在将其导入并将其添加到基于 class 的视图的权限列表中:

. . .
from .permissions import IsPrivateAllowed

class PrivateAPIView(APIView):
    permission_classes = [IsAuthenticated, IsPrivateAllowed]
    . . .

这里发生的事情是当用户触发一个 API 调用时,Django 将首先检查用户是否满足列表中的所有权限,如果满足 - 用户将有权访问特定的 API 调用。