Запретите вошедшему в систему пользователю подглядывать за заказами других клиентов
class OrderDetailView(LoginRequiredMixin,
DetailView):
model = Order
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["object_list"] = self.object.selectedproduct_set.all()
if context["object_list"].first():
if context["object_list"].first() != self.request.user:
return {}
context["grand_total"] = get_total(context["object_list"])
return context
Это для интернет-магазина. LoginRequiredMixin проверяет только то, вошел ли пользователь в систему или нет. Но вошедший в систему пользователь может просматривать чужие заказы.
То есть занятой пользователь может вручную просмотреть заказы, например /orders/15, /orders/16, и взглянуть на их содержимое. Это невыносимо.
По мере своих возможностей я предотвратил это, проверив, является ли пользователь владельцем заказа. Но это неуклюже: мы должны отправлять статус 403 или что-то в этом роде, а не просто показывать пустой список.
Можете помочь мне понять, как это сделать?
Проще всего, вероятно, просто предварительно отфильтровать набор запросов с Order
s из request.user
, это вернет 404 для Order
s, которые не принадлежат пользователю:
class OrderDetailView(LoginRequiredMixin, DetailView):
model = Order
def get_queryset(self, **kwargs):
return super().get_queryset(**kwargs).filter(user=self.request.user)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["object_list"] = self.object.selectedproduct_set.all()
context["grand_total"] = get_total(context['object_list'])
return context
Note: It is normally better to make use of the
settings.AUTH_USER_MODEL
[Django-doc] to refer to the user model, than to use theUser
model [Django-doc] directly. For more information you can see the referencing theUser
model section of the documentation.