如何防止用户在Django DetailView中看到不属于他们的数据?

时间:2018-11-01 17:16:33

标签: python django django-models

我有一个Web应用程序,用户在其中登录并开始输入create index idx3 on t3(time, id1, id2, name); 的项目。 ToDoList包含在base.html中,因此用户在登录之前无法在应用程序中看到任何内容。我正在使用以下方法进行测试:

  • is_authenticated登录
  • 添加新的User2
  • 重定向到ToDoListItem
  • 在这种情况下,URL = DetailView

在这一点上,我意识到只要将现有的http://localhost:8000/to_do_list/to_do_item/72输入以下内容即可,User2允许ToDoListItem看到User1的任何pk的详细信息:{{ 1}}。

urls.py包含

http://localhost:8000/to_do_list/to_do_item/<int:pk>

views.py

path('to_do_item/<int:pk>', views.ToDoListItemDetail.as_view(), name='todo-item-detail'),

todolistitem_detail.html

class ToDoListItemDetail(DetailView):
    model = ToDoListItem

为防止这种情况发生的建议方法是什么?我正在考虑以下内容:

  1. 我可以完全删除DetailView并定向到仅返回用户数据的另一个URL(使用类似{% extends 'base.html' %} {% block content %} <a href="/">Home</a> <h1>DetailView for 'ToDoListItem' model</h1> <p>TaskTitle: '{{ object.title }}'</p> <p>Complete: '{{ object.is_complete }}'</p> <p>User: '{{ object.user}}'</p> {% endblock %} 的东西)
  2. 我可以检查登录用户的名称是否与拥有ToDoListItem.objects.filter(user=request.user)的用户的名称匹配。
  3. 我可以为DetailView覆盖ToDoListItem并在那里检查用户所有权(类似于No.1,但在DetailView中)
  4. ??? (还有其他比我还不知道的更好的东西)

是否有一种方法可以限制用户在整个应用程序中仅查看自己的数据,而无需在每次需要时都执行此逻辑?

2 个答案:

答案 0 :(得分:1)

您也可以通过覆盖get_queryset method [Django-doc]from django.contrib.auth.mixins import LoginRequiredMixin class ToDoListItemDetail(LoginRequiredMixin, DetailView): model = ToDoListItem def get_queryset(self, *args, **kwargs): return super(ToDoListItemDetail, self).get_queryset( *args, **kwargs ).filter(user=self.request.user)中进行过滤

get_queryset(..)

Django将在幕后始终致电model。默认情况下,此函数返回您为所有对象指定的id的查询集。但您因此可以将其进一步过滤。

Django的get_object method [Django-doc]随后将使用slug和/或self.request.user对其进行进一步过滤,但是如果您已经过滤掉了不属于{{1}}的元素, ,那么这只会导致查询不返回任何结果。

在这里将LoginRequiredMixin [Django-doc]添加到您的班级也很有意义,因为如果用户未登录,您可能希望将hem / her重定向到登录屏幕。

答案 1 :(得分:0)

有一个名为:“可以读取”的权限,该权限允许您处理访问。例如:

class FruitEdit(PermissionRequiredMixin,DetailView):
      permission_required = 'app.read_fruit'
      ...

我希望你能解决