代码之家  ›  专栏  ›  技术社区  ›  bignose

如果用户无权查看实例,请回复Not Found

  •  0
  • bignose  · 技术社区  · 4 年前

    我如何修改Django的行为 一些 仅用于模型,以掩盖该模型中除用户有权查看的对象之外的任何对象的存在?

    默认情况下,Django将响应对 不存在 404对象 Not Found ,以及 现有的 用户不允许查看的对象,403 Forbidden .

    这适用于典型的Django视图和专门的视图(如Django REST框架)。默认情况下,这一切都是正确的。

    不过,我想做的是向每个用户展示一些特定的模型,这些模型包含 只有用户可以查看的记录 ,其中没有其他可查询的内容。如果他们被授权查看该实例,则会显示该实例;如果它存在但它们没有被授权,那么Django甚至不应该透露该实例是否存在,并且应该只以404响应 未找到 .

    这一要求是 只为 一些 数据库中的模型 例如,机密文件:访问者不应该四处嗅探,发现哪些文件存在,哪些不存在。要么他们有权查看该文档,要么他们不应该被告知那里有任何东西,就像他们查询了一个不存在的文档一样。

    For 其他模型,正常行为是正确的 (如果未找到则为404,如果存在但当前用户未被授权则为403)。

    因此,全局覆盖异常行为的解决方案对于这个问题是不正确的。

    我如何说服Django将特定模型视为未经授权的访问,就像不存在的实例一样?

    0 回复  |  直到 4 年前
        1
  •  0
  •   bignose    4 年前

    Django的权限系统包括 PermissionRequiredMixin ,一个用于视图的混合类,它将检查用户是否具有指定的权限,并处理用户没有指定权限的情况。

    因为 需要许可混合 是的一个子类 AccessMixin ,也许可以在类中创建一个新的特定组合来覆盖 AccessMixin.handle_no_permission :

    from django.contrib.auth.mixins import PermissionRequiredMixin
    
    class PermissionRequiredOrDoesNotExistMixin(PermissionRequiredMixin):
        """ A mix-in class that handles “not permitted” as though it were “not found”. """
    
        def handle_no_permission(self):
            ...
    
        2
  •  0
  •   bignose    4 年前

    第三方图书馆 django-guardian 实施定制 PermissionRequiredMixin 对于视图(此类从 django.contrib.auth.mixins.PermissionRequiredMixin ).

    该自定义类具有 return_403 return_404 属性,指定视图应在用户没有所需权限时返回其中一个HTTP响应(而不是重定向到登录页面的默认行为)。

        3
  •  0
  •   user9152964 user9152964    3 年前

    是,或:

    from django.views import View 
    from django.contrib.auth.mixins import UserPassesTestMixin
    from django.http import Http404
    
    
    class StaffRequired(UserPassesTestMixin):
    
        def test_func(self):
            return self.request.user.is_staff
    
        def handle_no_permission(self):
            raise Http404
    
    
    class HiddenView(StaffRequired, View):
        pass