Django-tastypie: prepend_urls umgeht die Authentifizierung

Erstellt am 25. Aug. 2012  ·  8Kommentare  ·  Quelle: django-tastypie/django-tastypie

Entschuldigung, wenn das, was ich hier mache, beabsichtigt ist oder wenn ich nur etwas völlig falsch mache, aber ich denke, dass die Verwendung von prepend_urls zum Erstellen einer verschachtelten Ressource die Authentifizierung sowohl für die übergeordnete als auch für die untergeordnete Ressource umgeht. Ich habe ein ähnliches Beispiel wie im Kochbuch erstellt und mithilfe der ApiKey-Authentifizierung eine untergeordnete Ressource erstellt. Ich kann darauf zugreifen, obwohl ich nicht die richtigen Header übergeben habe. Die übergeordnete Ressource erfordert auch eine ApiKey-Authentifizierung.

Was ich ohne Authentifizierungsheader sehe, ist:

GET / api / v1 / article - 401 wie erwartet
GET / api / v1 / article / 1 / - 401 wie erwartet
GET / api / v1 / article / 1 / tags - Die Liste der Tags wird unerwartet zurückgegeben.

Es scheint mir, dass dies falsch ist und sicherlich nicht das ist, was ich erwarten würde.

bug documentation unconfirmed

Hilfreichster Kommentar

Ich habe das noch nicht ausprobiert, aber wenn es so funktioniert, wie Sie sagen, wird es definitiv ein Ansatz für mich sein. Ich denke jedoch immer noch, dass das, was ich hier gemeldet habe, ein Problem mit Tastypie ist - im Grunde genommen kann die in der Kochbuch-Authentifizierung dargestellte Technik vollständig umgangen werden, ohne dass der Entwickler es überhaupt merkt.

Alle 8 Kommentare

Nach meiner Erfahrung ist es viel einfacher und eleganter, nur die Funktion override_urls zu verwenden und eine eigene untergeordnete Versandmethode zu erstellen. Es ist weniger Code, hält sich an alle Metaeigenschaften Ihrer untergeordneten Ressourcen (einschließlich Authentifizierung) und noch einige mehr.

Beispiel:

    def override_urls(self):
        return [
            url(r'^(?P<resource_name>%s)/(?P<pk>\w[\w/-]*)/tags%s$' % (self._meta.resource_name, trailing_slash()), self.wrap_view('dispatch_tags'), name='api_article_tags'),
        ]

    def dispatch_tags(self, request, **kwargs):
        return ArticleTagResource().dispatch('list', request, **kwargs)

Auf diese Weise kann Ihre ArticleTagResource die gesamte Anforderung von / article / 1 / tags / so verarbeiten, als ob sie als Listenansicht angefordert worden wäre (ändern Sie "Liste" in "Detail", damit sie sich wie eine Detailansicht verhält).

Ich habe das noch nicht ausprobiert, aber wenn es so funktioniert, wie Sie sagen, wird es definitiv ein Ansatz für mich sein. Ich denke jedoch immer noch, dass das, was ich hier gemeldet habe, ein Problem mit Tastypie ist - im Grunde genommen kann die in der Kochbuch-Authentifizierung dargestellte Technik vollständig umgangen werden, ohne dass der Entwickler es überhaupt merkt.

Ich habe das gleiche Problem und ich habe versucht, Joeribekkers Methode die gleichen Ergebnisse, eine Idee, wann dies behoben wird? oder irgendwelche Problemumgehungen?

Ich mag die Idee, Resource.dispatch() , aber wenn Sie etwas komplizierteres als eine Detail- oder Listenansicht tun möchten, ist dies nicht wirklich realisierbar.

Eine Lösung, über die ich nachgedacht habe, besteht darin, einige der schwereren Hebevorgänge von Resource.dispatch() in Resource.wrap_view() damit wrap_view() verwendet werden kann, um jede Ansicht willkürlich zu verpacken, während alle angewendet werden die Authentifizierungs-, Autorisierungs- und Drosselungsregeln (möglicherweise auch die Methodenprüfung, mehr dazu weiter unten).

Ich bin auf dieses Problem mit Drosselung gestoßen. Meine derzeitige Problemumgehung besteht darin, einen Dekorateur zu haben, in den ich meine benutzerdefinierten Ansichten einbinde: @apply_throttle . Der Dekorateur kopiert den Code mehr oder weniger von Resource.throttle_check() und Resource.log_throttled_access() .

Es kann für Tastypie am effektivsten sein, sowohl einen vollständigeren wrap_view() (einschließlich der oben genannten) als auch Dekorateure (oder eine andere Möglichkeit, diese Dinge selektiv anzuwenden) zu haben, nur für den Fall, dass der Entwickler beabsichtigt, die Überschreibungen zu verwenden Umgehen Sie tatsächlich das normale Verhalten (z. B. wenn Sie einen überschriebenen Endpunkt haben, der eine andere Drosselung benötigt oder die Authentifizierungsanforderungen lockert). Dekorateure sind auch eine gute Möglichkeit, bestimmte Methodenprüfungen (GET, POST usw.) auf Überschreibungen anzuwenden, ohne dass diese Boilerplate am Anfang Ihrer Methode vorhanden sein muss. Ich weiß, dass ich Overrides verwendet habe, bei denen all dies nützlich gewesen wäre.

Was denken alle über diese Art von Lösung? Ich bin definitiv daran interessiert, daran zu arbeiten, aber ich bin momentan ziemlich angeschlagen.

Ich habe damit zu kämpfen, aber ich habe SO gefunden und darauf geantwortet.
http://stackoverflow.com/questions/11827368/tastypie-override-urls-ignores-authentication-and-authorization

Dies ist ein alter Thread, aber da die Probleme noch offen sind und bei meiner Suche einen hohen Stellenwert haben ... ein Anruf bei
self.is_authenticated(request) in der ersten Zeile des Handlers kümmert sich um das Problem. getestet mit tastypie 0.11 & 0.12.

Das Kochbuch empfiehlt jetzt die Verwendung von self.wrap_view () in prepend_urls (), um dieses Problem zu beheben.

Bei einem Ereignis mit wrap_view benötigte ich self.is_authenticated(request) in der Handler-Methode.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen