如何限制 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 调用。
我正在使用 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 调用。