Ограничить доступ к просмотру страниц для определенных пользователей / клиентов - PullRequest
0 голосов
/ 10 июня 2009

Конечно, это не новый вопрос, но вот он:

В моей системе заказов на основе Django каждый пользователь (который не является сотрудником) связан с объектом CustomerProfile, который сопоставляет этого пользователя с правильным объектом Customer. Этот клиент пользователи могут войти и просмотреть неоплаченные счета. Для просмотра счетов клиента вы переходите к чему-то вроде этого:

/ счета / клиент / 97 /

(Счет клиента № 97)

Это нормально, но мне нужно включить некоторую аутентификацию, чтобы пользователь, являющийся частью профиля клиента, не мог просмотреть счета другого клиента, например, вручную введя / invoices / customer / 92 / (счет 92 принадлежит другому клиенту) .

У меня есть это, но это действительно не хороший код (и не работает):

def customer_invoice_detail(request, object_id):
    user = threadlocals.get_current_user()
    try:
        userprofile = UserProfile.objects.get(user=user)
        user_customer = userprofile.customer.id
    except UserProfile.DoesNotExist:
        user_customer = None
    if (request.user.is_authenticated() and user_customer is not null) or request.user.is_staff():
        invoice = CustomerInvoice.objects.get(pk=object_id)
        product_list = CustomerInvoiceOrder.objects.filter(invoice=object_id)
        context = {
        'object': invoice,
        'product_list': product_list,
        }
        return render_to_response("invoices/customer_invoice_detail.html", context, context_instance=RequestContext(request))
    else:
        return HttpResponse("You are not authorised to view this invoice")

Должен ли быть лучший / более простой способ справиться с этим - есть идеи?

Приветствия

Ответы [ 2 ]

2 голосов
/ 10 июня 2009

Добавьте поле в модель вашего счета с именем user:

user = models.ForeignKey(User, related_name="invoices")

, затем извлекайте записи для определенного пользователя, например:

invoice = CustomerInvoice.objects.get(pk=object_id, user=request.user)

Получение счетов для данного пользователя в таком случае тривиально с обратным соотношением:

request.user.invoices.all()

Также посмотрите на декоратор @ login_required .

2 голосов
/ 10 июня 2009

Я бы порекомендовал сделать бизнес-логику для вашей модели клиента. Таким образом, у вас может быть метод get_invoices(), который возвращает список счетов только для этого клиента. Этот метод, в свою очередь, вызовет метод is_authenticated(), который гарантирует, что текущее состояние позволяет получать защищенные данные клиента или вызывает исключение.

При этом независимо от того, где ваш код пытается получить счета для клиента, всегда будет выдано исключение, если текущее состояние не имеет доступа к счетам, и вам не придется беспокоиться о непоследовательном поведении до тех пор как вы используете эти методы.

...