【问题标题】:How to limit Django REST API to only ONE user?如何将 Django REST API 限制为只有一个用户?
【发布时间】:2021-01-02 13:51:44
【问题描述】:
我正在使用 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,即使返回的数据与往常相同,但只是私有的。
【问题讨论】:
标签:
python
django
django-rest-framework
django-rest-auth
【解决方案1】:
每个用户都应该有他们唯一的身份验证令牌。允许某些用户访问的方法是创建权限。 Django 中的权限用于验证用户是否有权执行某些操作。
Django创建权限的方法是在相关的应用程序文件夹中创建permissions.py文件,在该文件中你应该编写继承permissions.BasePermission类并覆盖has_permission方法的权限类,如果用户应该有权限,则返回True或@ 987654325@ 否则。之后,您只需将您的权限类添加到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 中的 name 参数兼容。现在导入它并将其添加到基于类的视图的权限列表中:
. . .
from .permissions import IsPrivateAllowed
class PrivateAPIView(APIView):
permission_classes = [IsAuthenticated, IsPrivateAllowed]
. . .
这里发生的情况是当用户触发 API 调用时,Django 将首先检查用户是否满足列表中的所有权限,如果满足 - 用户将有权访问特定的 API 调用。