2016-06-08 16 views
1

ich verwenden, um die folgende benutzerdefinierte BerechtigungsklasseIndividuelle Berechtigungsklasse in Django Tastypie

class CustomDjangoAuthorization(DjangoAuthorization): 
    def read_detail(self, object_list, bundle): 
     result = super(CustomDjangoAuthorization, self).read_detail(object_list, bundle) 
     # now we check here for specific permission 
     if bundle.request.user.profile.user_status: 
      raise Unauthorized("You are not allowed to access that resource.") 
     return result 

Es gibt

401 Unauthorized

wenn die user_status = 1. Aber wenn ich die user_status-0 ändern, zeigt es noch

401 Unauthorized

Fehler.

Mein unsends Autorisierungsverstand war, dass tastypie für jede Anfrage Autorisierung prüft und eine 200 Antwort für Ok und 401 für Unauthorized gibt. Fehle ich hier etwas?

Hey Sean, ich habe versucht, benutzerdefinierten Code vor Super zu bewegen. Ich bekomme eine

AttributeError: ‘AnonymousUser’ object has no attribute ‘profile’

Alles funktioniert in localhost, Produktion gibt ein Problem. Dies geschieht in beiden Fällen, wenn user_status = 1 & wenn user_status = 0

Mit Django 1.8 und Tastypie 0.13.3.

+0

Es ist durchaus möglich, dass Ihr Aufruf von super() 401 aus einem nicht verknüpften Grund zurückgibt und Sie es an den Benutzer zurückgeben. Könnte überprüfen, welches Ergebnis im Ergebnis ist :) –

+0

Ah, die DjangoAuthorization erfordert, dass Sie angemeldet sind, daher hat das "AnonymousUser" -Objekt kein Attribut "profile", denke ich. –

Antwort

0

Ihren eigenen Code vor dem Aufruf von super(), Verschieben und einen Scheck hinzufügen, um zu sehen, ob der Benutzer anonym ist:

class CustomDjangoAuthorization(DjangoAuthorization): 
    def read_detail(self, object_list, bundle): 
    # check here for specific permission 
    if (not bundle.request.user.is_authenticated()) or bundle.request.user.profile.user_status: 
     raise Unauthorized("You are not allowed to access that resource.") 
    result = super(CustomDjangoAuthorization, self).read_detail(object_list, bundle) 
    return result 

Sie wurden AttributeError: ‘AnonymousUser’ object has no attribute ‘profile’ weil Ihre Benutzer immer wurden abgemeldet, so request.user ein AnonymousUser war, daher keine profile.

+0

Mein Benutzer wurde nicht ausgeloggt. Er ist authentifiziert, da ich den API-Schlüssel und den Benutzernamen in meiner Anfrage sehen kann. Es sollte nicht "Unauthorized" ausgelöst werden, wenn user_status = 1. Es funktioniert gut in meinem localhost, nicht in der Produktion. – learner

+0

Ihr Benutzer * ist * ausgeloggt, sonst hätten Sie keinen 'AnonymousUser'. Möglicherweise senden Sie Auth-Daten, aber Ihr Server macht offensichtlich nichts damit zu tun. Wenn es in dev, aber nicht in prod funktioniert, deutet das auf ein Problem hin, dass entweder der Prod-Code nicht mehr aktuell ist oder der Server falsch konfiguriert ist. Stellen Sie sicher, dass Ihre Auth-Header den Prozess durchlaufen, in dem Ihr Django-Projekt ausgeführt wird. –

+0

Ja, Sie haben Recht, haben eine Erklärung in meiner Antwort gegeben. – learner

0

Basierend auf Ihrem Code und Symptome Ich vermute, Sie haben schlechte Autorisierungsdetails. Überprüfen Sie Ihre username und api_key. Wahrscheinlich haben Sie einen Tippfehler oder Sie verwenden eine lokale Autorisierung Details zur Produktion.

+0

Ja, meine URL wurde nicht authentifiziert. Siehe meine Antwort für Details. – learner

1

@Sean Hayes hat recht, mein Benutzer wurde ausgeloggt. Ich verwende eine benutzerdefinierte URL und wusste nicht, dass meine APIAuthentication nicht standardmäßig verwendet wurde.

Ich musste self.is_authenticated(request) in meiner benutzerdefinierten Methode hinzufügen, damit es funktioniert.

Verwandte Themen