簡體   English   中英

如何防止用戶在 Django DetailView 中看到不屬於他們的數據?

[英]How to prevent users from seeing data that does not belong to them in Django DetailView?

我有一個 Web 應用程序,用戶可以在其中ToDoList並開始為ToDoList輸入項目。 base.html包含在is_authenticated檢查中,因此用戶在登錄之前無法在應用程序中看到任何內容。我正在做一些測試:

  • User2身份登錄
  • 添加一個新的ToDoListItem
  • 重定向到DetailView
  • 在這種情況下,URL = http://localhost:8000/to_do_list/to_do_item/72

在這一點上,我意識到 DetailView 將允許User2查看User1任何ToDoListItem的詳細信息,只需將現有的pk輸入到: http://localhost:8000/to_do_list/to_do_item/<int:pk>

urls.py 包括

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

視圖.py

class ToDoListItemDetail(DetailView):
    model = ToDoListItem

todolistitem_detail.html

{% 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 %}

防止這種情況發生的推薦方法是什么? 我正在考慮以下幾點:

  1. 我可以完全刪除 DetailView 並定向到僅返回用戶數據的不同 URL(使用類似ToDoListItem.objects.filter(user=request.user)
  2. 我可以檢查登錄用戶的名稱是否與擁有ToDoListItem的用戶名稱匹配。
  3. 我可以覆蓋 DetailView 的get_context_data()並在那里檢查用戶所有權(類似於 1,但在 DetailView 中)
  4. ??? (還有比上面更好的東西,我還不知道)

有沒有辦法限制用戶在整個應用程序中只能看到他們自己的數據,而無需在每次需要時實現此邏輯?

您也可以通過覆蓋get_queryset方法 [Django-doc]DetailView進行過濾

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)

Django 會在幕后總是調用get_queryset(..) 默認情況下,此函數返回您為所有對象指定的model 但是你可以進一步過濾它。

Django 的get_object方法 [Django-doc]然后將使用id和/或slug進一步過濾它,但是如果您已經過濾掉不屬於self.request.user的元素,那么這只會導致查詢沒有返回結果。

在這里將LoginRequiredMixin [Django-doc] 添加到您的類中也是有意義的,因為如果用戶沒有登錄,您可能希望將下擺/她重定向到登錄屏幕。

有一個名為:“可以讀取”的權限,允許您處理訪問。 例如:

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

我希望你能解決它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM