【问题标题】:Django REST framework checks unnecessary permissionsDjango REST 框架检查不必要的权限
【发布时间】:2017-04-02 19:54:47
【问题描述】:

我是否使用 django rest 框架 (v3.4.6) 对象级权限。但是,我无法弄清楚一些事情。首先,我创建了一个自定义权限,用于检查用户是否为特定商店工作:

class Works4Shop(BasePermission):
  def has_object_permission(self, request, view, obj):

    profile = request.user.profile
    if obj.shop in profile.shops.all():
        return True
    else:
        return False

然后我将permission_classes = (Works4Shop,) 添加到新的自定义视图类ShopItemsView(APIView) 现在开始好奇的部分,首先我读到我需要通过调用self.check_object_permissions(request,obj) 来显式检查对象级别的权限。但是我看到的是,通过模型管理器获取任何对象都会对检索到的对象强制执行策略。不完全是,它确实调用了has_object_permission(self, request, view, obj),但它忽略了结果。问题是性能,这种事情给DB带来了很多不必要的选择。谁能解释一下?我还可以从数据库中发布日志。

【问题讨论】:

  • 除了你的问题。您能解释一下为什么同时使用profile = UserProfile.objects.get(user=request.user)profile = request.user.profile 来分配配置文件吗?我认为两者都不需要
  • 我的理解是对象级别的权限旨在检查每个返回的对象是否满足这个权限条件。也许您只想要一个普通的has_permission(),每个请求都会检查一次?
  • @rrmerugu 这是我在复制代码时的一个错误。我正在尝试不同的方法来获取配置文件。
  • @serg 是的。但是,文档说明需要对 self.check_object_permissions(request,obj) 的显式调用,以及如果它们返回 False 但后端忽略了它们的结果,检查的意义何在

标签: python django django-rest-framework


【解决方案1】:

所以答案比我想象的要简单。基本上这个问题只发生在使用可浏览 API 时。在模板呈现期间,有许多模板标签用于使用 View 类中指定的每种请求(post、put、delete 等)的表单,并且单独检查每个表单的对象权限。当我使用纯 json 格式时,一切都开始正常工作,没有不必要的检查等。

但是有一个问题。可浏览的 api 检查获取的每个对象的权限,这反过来又会产生一个问题:您不知道 has_object_permission(self, request, view, obj) 中的 obj 类是什么,因此您应该进行显式检查,否则 APIView 将抛出 TypeError

【讨论】:

    猜你喜欢
    • 2017-04-13
    • 2016-11-20
    • 2016-09-04
    • 2014-08-25
    • 2016-01-25
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 2016-01-10
    相关资源
    最近更新 更多