Django-tastypie: prepend_urlsは認証をバイパスします

作成日 2012年08月25日  ·  8コメント  ·  ソース: django-tastypie/django-tastypie

ここで行っていることが設計によるものである場合、またはまったく間違っている場合はお詫びしますが、prepend_urlsを使用してネストされたリソースを作成すると、親リソースと子リソースの両方で認証がバイパスされると思います。 クックブックと同様の例を作成し、ApiKey認証を使用して子リソースを作成しました。正しいヘッダーを渡さなくても、それにアクセスできます。 親リソースには、ApiKey認証も必要です。

認証ヘッダーなしで表示されるのは次のとおりです。

GET / api / v1 / article-期待どおり401
GET / api / v1 / article / 1 / -401期待どおり
GET / api / v1 / article / 1 / tags-タグのリストが予期せず返されます。

これは間違っているように思われ、確かに私が期待するものではありません。

bug documentation unconfirmed

最も参考になるコメント

私はまだこれを試していませんが、あなたが言うようにそれがうまくいくなら、それは間違いなく私が取るアプローチになるでしょう。 ただし、ここで報告したのはTastypieの問題だと思います。基本的に、クックブック認証に示されている手法を使用すると、開発者が気付かないうちに完全にバイパスできます。

全てのコメント8件

私の経験では、override_urls関数のみを使用して、独自のディスパッチ子メソッドを作成する方がはるかに簡単でエレガントです。 コードが少なく、すべての子リソースメタプロパティ(認証を含む)に準拠し、次に一部に準拠します。

例:

    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)

これにより、ArticleTagResourceは、/ article / 1 / tags /からのリクエスト全体を、リストビューとしてリクエストされたかのように処理できます(「list」を「detail」に変更して、detail-viewのように動作させます)。

私はまだこれを試していませんが、あなたが言うようにそれがうまくいくなら、それは間違いなく私が取るアプローチになるでしょう。 ただし、ここで報告したのはTastypieの問題だと思います。基本的に、クックブック認証に示されている手法を使用すると、開発者が気付かないうちに完全にバイパスできます。

私は同じ問題を抱えていて、joeribekkerの方法で同じ結果を試しましたが、これがいつ修正されるかについて何か考えはありますか? または回避策はありますか?

Resource.dispatch()を使用するというアイデアは好きですが、詳細ビューやリストビューよりも複雑なことをしたい場合は、実際には実行できません。

私が考えていた解決策の1つは、重いリフトの一部をResource.dispatch()からResource.wrap_view()て、 wrap_view()を使用して、すべてを適用しながら任意のビューを任意にラップできるようにすることです。認証、承認、およびスロットリングのルール(以下で詳しく説明しますが、メソッドもチェックする可能性があります)。

私はスロットルでこの問題に遭遇しました。 私の現在の回避策は、カスタムビューを@apply_throttleラップするデコレータを用意することです。 デコレータは、コードをResource.throttle_check()Resource.log_throttled_access()から多かれ少なかれコピーします。

開発者がオーバーライドを使用する意図がある場合に備えて、tastypieがより完全なwrap_view() (上記を含む)とデコレータ(またはこれらを選択的に適用する他の方法)の両方を持つことが最も効果的かもしれません。実際に通常の動作を回避します(たとえば、異なるスロットルを必要とする、または認証要件を緩和するオーバーライドされたエンドポイントがある場合)。 デコレータは、メソッドの最初にボイラープレートを設定しなくても、特定のメソッドチェック(GET、POSTなど)をオーバーライドに適用するための優れた方法でもあります。 これらすべてが役立つオーバーライドを使用したことはわかっています。

そのような解決策に対する皆さんの考えは何ですか? 私は間違いなくこれに取り組むことに興味があります、しかし私は今かなり時間に縛られています。

私はこれに苦労してきましたが、SOを見つけて答えました。
http://stackoverflow.com/questions/11827368/tastypie-override-urls-ignores-authentication-and-authorization

これは古いスレッドですが、問題はまだ開いていて、私の検索で上位にランクされているので...
ハンドラーの最初の行のself.is_authenticated(request)が問題を処理します。 tastypie 0.11&0.12でテスト済み。

クックブックでは、prepend_urls()内でself.wrap_view()を使用することを推奨し、この問題を解決しています。

wrap_viewを使用したイベントでは、ハンドラーメソッドにself.is_authenticated(request)が必要

このページは役に立ちましたか?
0 / 5 - 0 評価