Django-tastypie: より安党なデフォルトが必芁です `DjangoAuthorization`はすべおのモデルオブゞェクトぞの` read`アクセスを蚱可するべきではありたせん

䜜成日 2016幎01月06日  Â·  10コメント  Â·  ゜ヌス: django-tastypie/django-tastypie

tastypie/authorization.py 133のように-2016幎read_listマスタヌブランチを芋るず、デフォルトでは、 read_details䞡方がuser.has_perm()チェックをバむパスしたす。これは非垞に安党ではなく、悪いデフォルトです。

Djangoの管理者のデフォルトは型砎りです。 それで、私はそれがどのように誀解されたかを芋るこずができたした。

https://docs.djangoproject.com/es/1.9/topics/auth/default/#permissions -and-authorization

The Django admin site uses permissions as follows:
*   ... 
* Access to view the change list, view the “change” form and change an object is limited to users with the “change” permission for that type of object.

基本的に、「change_xyz」は「読み取り」ず「曎新」の䞡方のアクセス蚱可コヌドです。 私はより良いデフォルトはDjangoの管理者に埓うこずだず思いたす

diff --git a/tastypie/authorization.py b/tastypie/authorization.py
index 1d6f5aa..44b2d56 100644
--- a/tastypie/authorization.py
+++ b/tastypie/authorization.py
@@ -151,22 +151,14 @@ class DjangoAuthorization(Authorization):
         return model_klass

     def read_list(self, object_list, bundle):
-        klass = self.base_checks(bundle.request, object_list.model)
-
-        if klass is False:
-            return []
+        # By default, follows `ModelAdmin` "convention" to use `app.change_model`
+        # `django.contrib.auth.models.Permission` for both viewing and updating.
+        # https://docs.djangoproject.com/es/1.9/topics/auth/default/#permissions-and-authorization

-        # GET-style methods are always allowed.
-        return object_list
+        return self.update_list(object_list, bundle)

     def read_detail(self, object_list, bundle):
-        klass = self.base_checks(bundle.request, bundle.obj.__class__)
-
-        if klass is False:
-            raise Unauthorized("You are not allowed to access that resource.")
-
-        # GET-style methods are always allowed.
-        return True
+        return self.update_detail(object_list, bundle)

bug immediate

最も参考になるコメント

本番環境を壊すような倉曎を加える堎合、少なくずもそれをバヌゞョン管理に反映できたすか
Tastypieのx.y.zバヌゞョン管理は、ほずんどの人が期埅するものず非垞によく䌌

バヌゞョン番号MAJOR.MINOR.PATCHを指定しお、以䞋をむンクリメントしたす。
..
䞋䜍互換性のあるバグ修正を行う堎合のPATCHバヌゞョン。

新しい本番展開䞭にこれを远跡するのに非垞に䞍快な時間を費やしたした。

党おのコメント10件

これがすでにマヌゞされおいるこずを感謝したすが、私はただ問題を抱えおいたす。 新しいリク゚ストを開く前に、ここに私の懞念がありたす

この倉曎により、残念ながら既存のコヌドが砎損するため、䞋䜍互換性がなくなりたす以前は、すべおのGET芁求がDjangoAuthorizationを通過しおいたした。 コヌドを修正するには、すべおのナヌザヌに「倉曎」暩限を䞎える悪いか、読み取りアクションのカスタム実装のためにDjangoAuthorizationをサブクラス化する倚くの䜜業が必芁になる可胜性があるずいう2぀のオプションしかありたせん。 これは意図されたものですか

django adminコンテキストでこの背埌にある理由に感謝したすが、APIコンテキストで「change」ず同等に「read」を蚭定するこずは、予期される動䜜ではないため、賢明なデフォルトの仮定ではありたせん。 結局のずころ、GETがDjangoAuthorizationずずもに蚱可されたメ゜ッドである堎合、ナヌザヌがchange暩限を持っおいないずいう事実に基づいお、なぜアクセスを拒吊するのでしょうか。

私は圌に次の代替実装を提案したす

_for read_detail_

  • モデルにview暩限がある堎合は、それを確認したす=それを必芁ずする人のための改善
  • view暩限がない堎合は、垞に蚱可したす=䞋䜍互換性

_read_list_の堎合

  • モデルにlist暩限がある堎合は、それを確認したす=それを必芁ずする人のための改善
  • list暩限がない堎合は、垞に蚱可したす=䞋䜍互換性

このようにしお、tastypieは、Djangoのパヌミッションのデフォルトず互換性のあるデフォルトを远加し、DjangoAuthorizationのカスタム実装を䜜成する以倖に、必芁な人にビュヌずリストのパヌミッションを远加するこずで、改善するための簡単なパスを提䟛したす。

少なくずも、デフォルトの暩限を指定する方法があるはずです。

DjangoAuthorization(read_permission='view', # applies to both list, detail if not spec'd
                    read_list_permission='view', # list only
                    read_detail_permission='view') # detail only
# while we're at it, why not add the other permissions too
DjangoAuthorization(change_permission='change',
                    delete_permission='delete',
                    add_permission='add', 
                    # ... add options as per above for each
                    # <action>_<level> permission where 
                    # action is `change,delete,add,read`,  level is `list,detail`)

@SeanHayesが決定したす。

ここでの私の意芋ですが、デフォルトで読み取りを蚱可するこずはセキュリティの問題だったず思いたす。 生産に非垞に近づくたで、私はそれをたったく期埅しおいたせんでした。 このコンテキストでは、䞋䜍互換性を砎る必芁があるず思いたす。

あなたの提案では、既存のコヌドにパラメヌタパスをDjangoAuthorizationに倉曎する必芁があるように芋えたす。その堎合、クラスを別の名前で呌び出す方が明確だず思いたす。

read_permission='view'堎合を考えおみおください。これが、たさに必芁なものかもしれたせん。 なぜそれが最適ではないのか分かりたせん

class ModifiedDjangoAuthorization(DjangoAuthorization):
    READ_PERM_CODE = 'view'

他を倉曎したい堎合は、メ゜ッドをオヌバヌラむドするだけです。 倉曎は実際にそれを非垞に簡単にするように蚭蚈されたした。

class ModifiedDjangoAuthorization(DjangoAuthorization):
    def delete_list(self, object_list, bundle):
        return self.perm_list_checks(bundle.request, 'del', object_list)

    def delete_detail(self, object_list, bundle):
        return self.perm_obj_checks(bundle.request, 'del', bundle.obj)

倉曎は倉曎を念頭に眮いおおり、それを簡単にしたした。 initparamsずしお実行する必芁はないず思いたす。

デフォルトで読み取りを蚱可するこずはセキュリティの問題だったず思いたす。

私は元の問題の意図を疑っおいたせん。 マヌゞされた実装は、蚀わずに人々の既存のコヌドず仮定を砎り、元に戻すための効率的なオプションがないこずを指摘するだけです。

あなたの提案では、DjangoAuthorizationぞのパラメヌタパスを既存のコヌドに倉曎する必芁があるようです。

私が提案した゜リュヌションをもう䞀床芋おみるず、私が提唱しおいるのは、安党で䞋䜍互換性のあるデフォルトのオプションを人々に提䟛するこずです。 この堎合、ナヌザヌのコヌドを倉曎する必芁はありたせん。

このコンテキストでは、䞋䜍互換性を砎る必芁があるず思いたす。

同意したせん。 珟圚マヌゞされおいる倉曎は、䞋䜍互換性を損なうだけでなく、GETを蚱可する必芁があるすべおのナヌザヌに倉曎蚱可を割り圓おるずいう明癜な方法珟圚の実装によっお暗瀺されるずいう点で、はるかに倧きな朜圚的なセキュリティ問題をもたらしたす。

率盎に蚀っお、読み取りアクションのchangeアクセス蚱可がセキュリティをどのように向䞊させるかはわかりたせん。同時に、このアクセス蚱可はPUTも蚱可したす。 異なるアクションの暩限を混圚させるこずは良い遞択ではないようです。

残念ながら、提案されたModifiedDjangoAuthorizationは、実際にモデルにview暩限を远加しない限り、トリックを実行しないため、䞋䜍互換性が倱われおいたす。 少なくずも、コヌドを倉曎する必芁がありたす。そのため、䞋䜍互換性を砎り、ナヌザヌにコヌドベヌスのやり盎しを匷制したす。

もちろん、オヌバヌラむドは垞に特定の芁件を達成するためのオプションですが、tastypieの䞀般的な考え方は、カスタムコヌドを远加する必芁のない賢明で安党なデフォルトを提䟛するこずだず思いたす...

芁するに、より良い実装のために、この倉曎を元に戻す必芁があるず思いたす。

change暩限は、Django自䜓から取埗されたす。 これはDjangoのデフォルトであり、DjangoAdminアプリのセットアップ方法です。 オプションviewはそうではありたせん。 私は個人的にreadず名付けたした。

modelチェックしお、どういう意味かわからない。 _metaをチェックするこずを意味する堎合、それは䞍完党である可胜性がありたす。 あなたがdbを打぀こずを意味するならば、私はそれが䞍必芁に高䟡であるずわかりたした。

私の奜みでは、あなたが提案したこずは、デフォルトの承認には「魔法が倚すぎる」偎にあるようです。 安党なデフォルトを蚭定し、簡単に䞊曞きできるようにするだけで十分なようです。 しかし、それは私の意芋です。

倉曎はここに文曞化されおいたす https 

率盎に蚀っお、読み取りアクションの倉曎アクセス蚱可がセキュリティをどのように向䞊させるかはわかりたせん。同時に、このアクセス蚱可はPUTも蚱可したす。 異なるアクションの暩限を混圚させるこずは良い遞択ではないようです。

ナヌザヌが䜕かを倉曎できれば、それを読むこずができるこずを私たちは知っおいたす。それがDjango管理者が行う方法です。

このバヌゞョンは、開発者に自分たちが䜕をしおいるのかを考えさせるため、より安党です。 開発者が独自の「読み取り」暩限を発明する代わりに、「読み取り」暩限のみを持぀べきずきに、意図的に党員に「倉曎」暩限を䞎えるこずを遞択した堎合、それが問題です。 他の開発者が故意に愚かなこずをするのを止めるこずはできたせん。私はTastypieが愚かなこずをするのを止めるためにここにいたす。 この倉曎のポむントは、開発者が予期しない可胜性のある、DjangoAuthorizationを䜿甚するリ゜ヌスに察するグロヌバルな読み取りアクセス蚱可を防ぐこずでした。 新しい動䜜は、開発者がDjango管理者で経隓するこずず䞀臎しおいたす。

叀い動䜜が必芁な堎合

  1. 0.13.2にアップグレヌドしないでください。
  2. たたは、 read_list and read_detail`メ゜ッドをオヌバヌラむドしたす。

ドキュメントが改善される可胜性があるず思われる堎合は、PRを送信しおください。

フィヌドバックに感謝したす。 ドキュメントぞのリンクをありがずう、十分に公平です、それを芋逃しおしたったのは残念ですドキュメントはv0.13.2にあるのに察し、問題はv0.13.4に割り圓おられおいるこずに泚意しおください。

私のハメ撮りからいく぀かの最埌の発蚀をさせおください

ナヌザヌが䜕かを倉曎できれば、それを読むこずができるこずを私たちは知っおいたす。それがDjango管理者が行う方法です。

Django管理者はchange暩限を䜿甚したす。これは、管理むンタヌフェヌスが_changeing_オブゞェクトに぀いお_is_であるためです。 そこでは理にかなっおいたす。 定矩䞊、REST APIでのGETリク゚ストは、_reading / viewing_に関するものです。 ほずんどの開発者は、倉曎する暩限がないためにDjangoAuthorizationが読み取りを拒吊するこずをたったく期埅しおいないず思いたす。

このバヌゞョンは、開発者に自分たちが䜕をしおいるのかを考えさせるため、より安党です。

tastypieが宣䌝しおいる機胜の1぀は、_合理的なデフォルト_を提䟛するこずです。 APIのGET定矩読み取りメ゜ッドずPUT倉曎メ゜ッドは、すべおの意図ず目的においお異なる操䜜であり、異なるアクセス蚱可も必芁であるず想定するのは非垞に合理的ではないでしょうか。

皆さんがそれが䟡倀のある远加だず思うなら、私が曞いたものに沿っおPRを提䟛させおいただきたす。

倉曎蚱可はDjango自䜓から来おいたす。 ...オプションビュヌはそうではありたせん。

Djangoにはview permissionを远加するための保留䞭のPRがあり、それが私がビュヌを䜿甚した理由です。

デフォルトでは、パブリック/グロヌバル読み取り操䜜を蚱可したせん。 それが最埌です。 たた、珟圚暙準的な方法がない堎合に、開発者がどのように暩限を蚭定しおいるかを掚枬する぀もりはありたせん。 それを「読む」ず「芋る」のどちらず呌ぶかさえわかりたせん。「私はこのようにしおいたす」たたは「新しいDjangoリリヌスはそれを別のものず呌んでいたす」ず蚀っおここにたくさんの人が来おほしくないです。 。

Djangoがすぐに読み取り/衚瀺暩限をサポヌトしおいる堎合は、それに切り替えたす。 今のずころ、開発者は、パヌミッションを凊理するカスタムの方法を凊理するために、いく぀かのカスタムコヌドを䜜成する必芁がありたす。

この問題が解決されたこずは知っおいたすが、チャむムを鳎らしお、この倉曎により、既存のプロゞェクトを0.13.xに移行できなくなったず蚀いたいだけです。

@miraculixxデヌタを衚瀺するためだけに倉曎暩限を芁求するのは少しおかしいずいう事実に関しお、あなたは完党に正しいず思いたす。 どういうわけか、Djangoのせいにするこずができるず思いたすが、それでも、ビュヌのアクセス蚱可の抂念がありたせんこれは私の私のものをたったく別のレベルで吹き飛ばしたすが、CRUD管理コンポヌネントを含むプロゞェクトに単にアクセス蚱可がないのは非垞識だず思いたすCRUDのREAD郚分。

本番環境を壊すような倉曎を加える堎合、少なくずもそれをバヌゞョン管理に反映できたすか
Tastypieのx.y.zバヌゞョン管理は、ほずんどの人が期埅するものず非垞によく䌌

バヌゞョン番号MAJOR.MINOR.PATCHを指定しお、以䞋をむンクリメントしたす。
..
䞋䜍互換性のあるバグ修正を行う堎合のPATCHバヌゞョン。

新しい本番展開䞭にこれを远跡するのに非垞に䞍快な時間を費やしたした。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡