Запретите вошедшему в систему пользователю подглядывать за заказами других клиентов

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 или что-то в этом роде, а не просто показывать пустой список.

Можете помочь мне понять, как это сделать?

Проще всего, вероятно, просто предварительно отфильтровать набор запросов с Orders из request.user, это вернет 404 для Orders, которые не принадлежат пользователю:

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 the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation.

Вернуться на верх