【发布时间】:2019-10-07 19:27:44
【问题描述】:
我正在使用一个名为 django-safedelete 的 Django 包,它允许删除用户而不将其从数据库中删除。
基本上,它会为模型添加一个delete 属性,而User.objects.all() 之类的查询不会返回已删除的模型。
您仍然可以使用特殊的管理器查询所有对象。例如 User.objects.all_with_deleted() 将返回所有用户,包括已删除的用户。 User.objects.deleted_only() 将返回已删除的。
这按预期工作,但在一种情况下除外。
我使用 Django Rest Framework 3.9 为我的用户使用令牌身份验证,在我的 DRF 视图中,我使用的是内置权限 IsAuthenticated。
我正在使用的基本 CBV 代码:
class MyView(APIView):
permission_classes = (IsAuthenticated,)
def get(self, request):
return Response(status=HTTP_200_OK)
IsAuthenticated权限的DRF实现代码:
class IsAuthenticated(BasePermission):
"""
Allows access only to authenticated users.
"""
def has_permission(self, request, view):
return bool(request.user and request.user.is_authenticated)
问题
当用户被软删除时,他仍然能够使用其令牌进行身份验证。
我预计用户在软删除时会出现 401 Unauthorized 错误。 怎么了?
【问题讨论】:
-
request.user and not request.user.delete and ...? -
您使用
SafeDeleteModel创建了自己的User模型并用它替换了默认模型? -
@BearBrown 我认为这不会起作用,因为 Permission 阶段是在 Authentication 阶段和身份验证是在默认的用户查询集上执行的。 (如果我错了,请纠正我......)
-
@David D. 你能添加一个简单的例子来说明如何使用包检索已删除的对象/Quryset?
-
@JPG 我添加了例子
标签: python django django-rest-framework soft-delete