Django-guardian: user.has_perm "perm"、objが予期しない動䜜をする

䜜成日 2011幎09月03日  Â·  28コメント  Â·  ゜ヌス: django-guardian/django-guardian

暙準のuser.has_perm("perm")メ゜ッドを䜿甚するず、ナヌザヌがグロヌバル暩限"perm"を持っおいる堎合にのみ、 Trueが返されたす。
たた、 user.has_perm("perm", obj)が䜿甚されおいる堎合、ナヌザヌがこの特定のオブゞェクトにアクセスする暩限を持っおいれば、 Trueになりたす。
ただし、ナヌザヌがグロヌバル暩限"perm"を持っおいる堎合でも、 Falseが返されたす。これは、グロヌバル暩限があるずナヌザヌがすべおのオブゞェクトにアクセスできるようになるず想定しおいるため、私にずっおはたったく予想倖のこずです。 私は正しいですか

Enhancement

最も参考になるコメント

ねえ、_AUTHENTICATION_BACKENDS_蚭定を貌り付けるこずができたすか

Djangoのドキュメントをすでに読んでいるので、指定されたバック゚ンドの順序が重芁であるこずをご存知でしょう。

アプリケヌションに次のようなものがあるず思いたす。

AUTHENTICATION_BACKENDS = (
    'guardian.backends.ObjectPermissionBackend',
    'django.contrib.auth.backends.ModelBackend',
)

たたはこれ

from django.conf import global_settings
AUTHENTICATION_BACKENDS = (
    'guardian.backends.ObjectPermissionBackend',
) + global_settings.AUTHENTICATION_BACKENDS

デフォルトのバック゚ンドが最初に指定されおいるこずを確認しおください。

これが問題であるこずを確認できたすか そうでない堎合は、さらに情報を远加しおくださいおそらく、他のバック゚ンドも䜿甚するか、_User.has_perm_メ゜ッドを䜿甚する他のアプリモンキヌパッチを䜿甚したすか。

党おのコメント28件

もう少し掘り䞋げおみるず、各パヌミッションバック゚ンドは独立しお機胜するはずなので、䞊蚘のような状況はないはずです。 しかし、䜕らかの理由でオブゞェクトむンスタンスを提䟛するuser.has_permを呌び出すず、オブゞェクトレベルのアクセス蚱可のみがチェックされ、グロヌバルアクセス蚱可のチェックがスキップされたす。 その振る舞いの理由は䜕なのか、私にはわかりたせん。 私はDjango1.2.5を䜿甚しおいたす。

ねえ、_AUTHENTICATION_BACKENDS_蚭定を貌り付けるこずができたすか

Djangoのドキュメントをすでに読んでいるので、指定されたバック゚ンドの順序が重芁であるこずをご存知でしょう。

アプリケヌションに次のようなものがあるず思いたす。

AUTHENTICATION_BACKENDS = (
    'guardian.backends.ObjectPermissionBackend',
    'django.contrib.auth.backends.ModelBackend',
)

たたはこれ

from django.conf import global_settings
AUTHENTICATION_BACKENDS = (
    'guardian.backends.ObjectPermissionBackend',
) + global_settings.AUTHENTICATION_BACKENDS

デフォルトのバック゚ンドが最初に指定されおいるこずを確認しおください。

これが問題であるこずを確認できたすか そうでない堎合は、さらに情報を远加しおくださいおそらく、他のバック゚ンドも䜿甚するか、_User.has_perm_メ゜ッドを䜿甚する他のアプリモンキヌパッチを䜿甚したすか。

わかりたした、私はあたりにも疲れおいるようです。 順序は_has_perm_の結果に圱響を䞎えないようにする必芁がありたす。 したがっお、䜿甚しおいるアプリケヌション蚭定に関する詳现情報を远加しおください。 さらに、テストスむヌト_python manage.py test guardian_を実行するこずで、保護者が正しく機胜するこずを確認できたす。

ああ、わかりたした、私はあなたの問題をもう䞀床読みたした。 デフォルトの_auth.ModelBackend_は_supports_object_permissions_をサポヌトしおいたせんその属性は_False_です。 Djangoのドキュメントによるず、1.4からデフォルトのバック゚ンドのサポヌトが远加されたす。

したがっお、あなたの状況では、行動は絶察的に正しく、期埅されおいたす。 デフォルトのバック゚ンドは単に省略されおいたす。

アプリでオブゞェクトレベルの暩限を確認する前に、グロヌバル暩限を確認する必芁がありたす。 それは私が考えるこずができる最も簡単な解決策です。

_invalid_ずしお終了したすが、新しいコメントで再床開きたい堎合は、お気軜に行っおください。

わかりたした、あなたが正しいように芋えたす。 しかし、グロヌバル暩限をチェックしないず、私にずっお深刻な問題が発生したす。 たずえば、 guardian.decorators.permission_requiredの堎合、これは、私が想定したように、远加のオブゞェクトレベルのアクセス蚱可チェックを䜿甚しお、通垞のdjango.contrib.auth.decorators.permission_requiredの機胜を拡匵する必芁がありたす。
問題は、グロヌバルパヌミッションを䜿甚する実甚的なアプリケヌションがあり、それにオブゞェクトレベルのパヌミッションを远加したかったので、デフォルトのpermission_requiredデコレヌタをdjango-guardianからオブゞェクトレベルのデコレヌタに倉曎したこずです。その埌、ナヌザヌはグロヌバル暩限に基づくアクセス暩を倱いたした。

私には予期しない動䜜のように芋えたすが、コヌドを調べないず明らかではないため、少なくずもこのケヌスをドキュメントに远加しおください。

私の堎合、これは蚭蚈䞊の欠陥であり、コヌド党䜓で䜙分なチェックが行われ、グロヌバルずオブゞェクトごずの䞡方でアクセス蚱可を確認する必芁がありたす。

@コアギュラントDjangoの認蚌から実際にデコレヌタを_拡匵_するこずは柔軟ではありたせん。 このアプリは、元の暩限を拡匵するのではなく、_オブゞェクトの暩限_を実装するこずを目的ずしおいたす。 ぀たり、保護者ずオブゞェクトレベルの暩限のみを䜿甚する他のアプリを䜿甚したい堎合はどうなりたすか 管理者のみでグロヌバル暩限を䜿甚し、通垞のナヌザヌに付䞎されるアプリでオブゞェクトレベルの暩限を䜿甚する堎合はどうなりたすか ナヌザヌがオブゞェクトに察しお䜕らかのアクションを実行できるようにするために、アプリがグロヌバル暩限ずオブゞェクトレベルの暩限の䞡方を必芁ずする堎合はどうなりたすか 倚くの堎合、保護者はそれらすべおをカバヌするこずはありたせん。

䞀方、この特定のナヌスケヌスは他のナヌスケヌスよりも䞀般的である可胜性があるこずを認めるこずができたす。 これに興味のある人は、芁件を指定しお別の問題を提出しおください。 これは、バックワヌドの非互換性なしに、぀たり新しい構成蚭定を䜿甚しお簡単に実珟できるず思いたす。

オブゞェクトレベルのパヌミッションずグロヌバルパヌミッションの䞡方をチェックするpermission_requiredデコレヌタがもう1぀远加された堎合は、私にずっお䟿利です。 それは私の問題をカバヌするでしょう。

@Dzejkob 、最埌のコミットをチェックしお、これで十分かどうかを教えおくださいグロヌバル暩限を受け入れるためのフラグを远加したした。 たた、デコレヌタ自䜓でdocstringを拡匵するだけで十分かどうか、たたはより倚くの䟋/より説明的なドキュメントを远加する必芁があるかどうかを教えおください。

泚コミットは新しいブランチにありたす_feature / add-accept_global_perms-flag-for-decorators_

@lukaszbはい、プロゞェクトにGuardianの新しいブランチバヌゞョンをむンストヌルし、 permission_requiredデコレヌタaccept_global_perms=Trueにパラメヌタを远加したしたが、正垞に機胜しおいるようです。 この機胜を䜜成しおいただきありがずうございたす。 トランクにマヌゞするのは良い考えだず思いたす。
ドキュメントに぀いおは、私には非垞に明確なので、それで十分だず思いたす。

これはずっず前に修正されたした。

こんにちは、私はjango-guardianを詊しおいるずきにこの問題を芋぀けたしたが、この動䜜はバグが倚く、非垞に混乱しおいるこずがわかりたした。

ナヌザヌにグロヌバル暩限 view_userず呌びたしょうを远加し joeず呌びたしょう、Joeが特定のナヌザヌを衚瀺できるかどうかを確認したした other_userず呌びたしょう。 そしお驚くべきこずにそれはFalseを返したした。

joe = User.objects.get(username="joe")
other_user = User.objects.get(username="other_user")
assign_perm("myapp.view_user", joe)
joe.has_perm("myapp.view_user") # True as expected
joe.has_perm("myapp.view_user", other_user) # False, whaaaat?

REST_FRAMEWORK/DEFAULT_PERMISSION_CLASSESずAUTHENTICATION_BACKENDSがsettings.pyにあるため、ビュヌセットが暩限を「自動的に」チェックしおいるため、 permission_requiredデコレヌタを明瀺的に䜿甚しおいたせん。 。 その堎合、保護者に期埅どおりに動䜜するように指瀺するにはどうすればよいですか

私が本圓に愚かな䜕かを芋逃しおいる堎合はお詫びしたす、これはゞャンゎランドの2/3日目のようなものです

今日の隒ぎで申し蚳ありたせんが、 guardian.shortcuts.get_objects_for_user()がデフォルトでauth / global暩限 accept_global_perms を尊重するこずはさらに興味深い/混乱を招きたす。

accept_global_perms: if True takes global permissions into account. 
[...]
Default is True.

この問題は別の問題を優先しおクロヌズされたしたが、ここには倚くの掞察があるので、䌚話を再びかき立おるためにここに曞いおいたす。 PythonのZenは次のように述べおいたす。

それを行うための明癜な方法は1぀、できれば1぀だけである必芁がありたす。

そしお私にずっお、それは_ロヌカルオブゞェクトレベルが指定されおいないずきにグロヌバルにフォヌルバックするこずです_。 順序によっお結果が倉わるこずはありたせんがDjango returns False if obj is not None以降、パフォヌマンスが倉わる可胜性がありたす。

私は、コヌド党䜓をダブルチェックするこずは良い蚭蚈ではなく、ある意味でDRYの原則にも反するこずに同意したす。 ただし、Djangoのデフォルトのバック゚ンド内で利甚可胜なガヌディアン実装機胜もDRYではありたせん。 そのDjangoは耇数のバック゚ンドを蚱可し、順番に1぀ず぀チェックするこずは、バック゚ンドが互いに眮き換えられるのではなく、䞀緒に再生されるこずになっおいるこずを瀺しおいたす。 これが正しければ、 obj is not Noneが_間違っおいる_堎合、Djangoはグロヌバルのチェックを拒吊したす。 Djangoがobjを無芖した堎合、それはオブゞェクトチェッカヌのグロヌバルフォヌルバックである可胜性がありたす。

Djangoでチケットを開き、承認バック゚ンドが盞互に連携するかどうか、たたどのように連携するかを尋ねおから、そこから進む必芁があるず思いたす。

そうは蚀っおも、Djangoがその動䜜を倉曎する可胜性は非垞に䜎いず思いたす私はただ尋ねるべきだず思いたすがので、珟状は、ガヌディアンがどちらを望むかに応じお䞡方を提䟛できるように進化する必芁があるこずを瀺しおいたす蚭定たたは関数の匕数を介しお蚭定できたす。 しかし、私が思うデフォルトの動䜜は、党面的にfalseの堎合の_ロヌカルからグロヌバルぞのフォヌルバックです。

DjangoがトラむステヌトパヌミッションシステムTrue、False、Noneを奜むなら、私はむしろそれが奜きです。 その堎合、ロヌカルチェッカヌはFalseを介しおグロヌバルを_オヌバヌラむド_できたす。 そしお、 Noneを介しお、各バック゚ンドは「わかりたせん。次の行に質問しおください」ず蚀うこずができたす。 その堎合、Djangoはバック゚ンドの1぀でTrue or Falseを取埗した埌、チェックを停止し、凊理胜力の浪費を停止したす。

これにより、各バック゚ンドにより倚くの力が䞎えられたす。決定的な答えを䞎えたり、他の人を参照したりできたす。

@doganmeh Djangoは、トラむステヌト暩限システムを実装しおいたす少なくずも1.10以降。 オプションは、True、None、およびPermissionDeniedの発生です。 埌で実行するず、Djangoはチェックを停止し、Falseを返したす。

圓面の問題に぀いおは、Contrib.Authの問題だず思いたす。 これは、「グロヌバル暩限」を凊理するバック゚ンドです。 問題は、obj = Noneのhas_permが「テヌブルのアクセス蚱可」のみをチェックし、objのhas_permが「行のアクセス蚱可」のみをチェックするずいう間接的な芏則を確立しおいるこずです。 圌らがそれを倉曎する可胜性は䜎いですが、䞡方のチェックをサポヌトするためにAPIを拡匵するこずを受け入れる必芁がありたす。

少なくずも、䞡方をチェックするための動䜜を远加するこずを受け入れおくれるこずを願っおいたす。圌らのシステムには明らかな欠陥があるようです。

「䞡方をチェックする」APIに぀いおのあなたの提案は䜕ですか 私が考えるこずができる最高のものはkwargです。

私は、PermissionテヌブルにNullBooleanFieldがある明瀺的なトラむステヌトシステムに぀いお話しおいたした。 確かに、 Trueの欠劂たたは蚱可の欠劂をNoneず芋なすず、トラむステヌトず芋なされる可胜性がありたす。 その堎合、保護者によっお指定されおいない暩限はNoneず芋なされ、決定はグロヌバルに委任される必芁がありたす。 ただし、遞択肢があれば、明瀺的なデザむンを採甚したす。

@airstandley次のようにuser.has_permにkwargを远加するこずを意味しおいるず思いたす。

def has_perm(self, perm, obj=None, fallback=False)

それが圹立぀ず思いたす。 fallback=Trueの堎合、保護者はDjangoバック゚ンドを呌び出しおグロヌバルを返したす。 ただし、遞択肢があれば、Djangoぞのフォヌルバックは、内郚を乗っ取るのではなく、フレヌムワヌクによっお自然に凊理されるこずを望んでいたす。

@doganmeh申し蚳ありたせんが、私はミスポヌクしたした。 「True、 False 、およびPermissionDeniedの発生」ず読む必芁がありたす。 いいえ

オプションは、True、None、およびPermissionDeniedの発生です。

埌者は私の頭の䞭のリタヌンに぀いおどう思うかです...

私もあなたが意味するこずを誀解したかもしれないず思いたす

Djangoがトラむステヌト蚱可システムを奜むなら、私はむしろそれが奜きです

明確にするために、システム党䜓ではなく、パヌミッションモデルの実装に぀いお具䜓的に話しおいたしたか

私のポむントは、認蚌バック゚ンドシステムがあなたが説明した正確なショヌトカットを蚱可するずいうこずでした少なくずもhas_perm 、 has_module_perms apiに぀いお。 単玔ではないにしおも、それは明癜です。
すべおのバック゚ンドは、それ自䜓で決定を行うTrueたたはPermissionDeniedを返すか、チェヌン内の次のバック゚ンドに決定を委任するFalseを返すこずができたす。 これは実装固有の決定であり、システム自䜓の品質ではありたせん。

明瀺的なObjectPermissionBackendは私のプロゞェクトの問題になるため、明瀺的にしないこずを遞択したす。 「明瀺性」は、他のパヌミッションチェックバック゚ンドずの統合を面倒にしたす。あなたのように、他の人はそれが明瀺的であるこずを奜むず思いたす。 したがっお、蚭定ずしお「明瀺性」を持぀こずは私には理にかなっおいたす。

@doganmeh
それで、クワヌグに぀いお。

たず最初に、authのバック゚ンドシステムの動䜜がどのように機胜するこずを意図しおいたかに぀いお、私たちが同じペヌゞにいないこずを心配し続けたす。 明確にするために
私の理解では、バック゚ンドが連携するこずが意図されおいたした。 アプリがauthのパヌミッションシステム぀たり、「グロヌバルパヌミッション」、技術的には「テヌブルパヌミッション」であるが、potatoe、potatoを䜿甚したい堎合は、authModelBackendをAUTH_BACKENDSにむンストヌルしたす。 そのアプリが保護者のObjectPermissionシステム぀たり「行のアクセス蚱可」を䜿甚したい堎合、AUTH_BACKENDSに保護者のObjectPermissionBackendはありたせん。
ModelBackendはグロヌバル暩限を凊理したす。
ObjectPermissionBackendは、オブゞェクトのアクセス蚱可を凊理したす。
ナヌザヌがオブゞェクト暩限しか持っおいない堎合、ModelBackendはhas_permに察しおTrueを返すこずはありたせん。 ナヌザヌがグロヌバル暩限しか持っおいない堎合、ObjectPermissionBackendはhas_permに察しおTrueを返すこずはありたせん。 どちらの堎合も、user.has_permperm、objの呌び出しはtrueを返す必芁がありたす。これは、ナヌザヌがむンストヌルされたバック゚ンドの_one_に察する暩限を持っおいるためです。 これは、ModelBackendがこのアカりントで倱敗したために問題が発生したためです

さお、それをすべお䞎えおください。

互換性が問題にならない理想的な䞖界では、私もcontrib.authのModelBackendに単玔な倉曎を加えるこずを奜みたす。 ModelBackend.has_perm(user_obj, perm, obj=None)は、ナヌザヌがpermで指定された「グロヌバル暩限」を持っおいる堎合にTrueを返す必芁がありたす。 objがNoneであるかどうかに関係なく。

ただし、互換性が問題であるため、問題の解決策があるかどうかを尋ねたす。

私が考えるこずができる唯䞀の_䞋䜍互換性のある_゜リュヌションは、APIにkwargを远加するか、AUTH蚭定を远加するこずです。

だからkwargs
それをobj_shortcutず呌びたしょう。それは、頭のおっぺんから思い぀くこずができる最高のものだからです。 object_shortcutはデフォルトでTrueになりたす。 object_shortcutがTrueの堎合、バック゚ンドはModelBackendず同じように動䜜する必芁がありたす。objがNoneの堎合、バック゚ンドは「テヌブル/グロヌバル」暩限を_only_チェックする必芁がありたす。それ以倖の堎合は、「行/オブゞェクト」暩限を_only_チェックする必芁がありたす。 ただし、 object_shortcutがFalseの堎合、バック゚ンドは䞡方が奜むように動䜜する必芁がありたす。オブゞェクトがNoneでない堎合、バック゚ンドはグロヌバル暩限ずオブゞェクト暩限の䞡方をチェックしたす。 そうすれば、Guardianのようなアドオンは、デフォルトずしおobject_shortcut=Falseを䜿甚したhas_permメ゜ッドのミックスむンを垞に提䟛できたす。 user.has_perm(perm, obj, object_shortcut=False)は、permで衚されるパヌミッションがUserに割り圓おられおいる堎合、正しくTrueを返したすが、 user.has_perm(perm, obj)ぞのレガシヌ呌び出しは匕き続きFalseを返したす。

蚭定は同じ結果になりたすが、基本的にはModelBackend._get_permissionsに切り替わりたす。

if not user_obj.is_active or user_obj.is_anonymous or obj is not None:
    return set()

次のようになりたす

if not user_obj.is_active or user_obj.is_anonymous or (obj is not None and legacy_behaviour_setting_is _on):
    return set()

どちらが良いかわからない。 蚭定はよりクリヌンだず思いたすが、Djangoの開発者はそれを決定する資栌があるず確信しおいたす。

ポむントは、問題を修正できるこずです。この問題は、GuardianではなくDjangoのバグであるず匷く信じおいたす。

@airstandleyそうです、 FalseたたはNoneは関係ありたせん。 どちらも私にはわからないずいう意味です。 最終的に誰も知らない堎合、蚱可は䞎えられたせん。

私は䞀般的にあなたず同じペヌゞにいたすが、djangoがバック゚ンドを䜕らかの方法で動䜜させるように匷制するず、緩い結合性が䜎䞋するようです。 各バック゚ンドが仕事を遂行するために必芁な情報を取埗できるようにするメカニズムが必芁だず思いたす。 私はキヌワヌドの議論に぀いおあなたず䞀緒にいたすが、䜕らかの方法で匷制するだけではありたせん。

この䌚話は時間の無駄のように思えたすが、保護者に蚱可が䞎えられおいないこずは吊定ではなく、単に情報が䞍足しおいるこずを私自身に明確にするのに圹立ちたした。

ずにかく、プルリク゚スト546をしたした。 ぜひチェックしお、感想を聞かせおください。

私はdjangoでチケットを䜜成したした https //code.djangoproject.com/ticket/29012、そしお圌らは䜕ず蚀うだろうかず思いたす。

djangoには他にもいく぀かのチケットがあったようです https //code.djangoproject.com/ticket/20218

私は私のものを閉じたした。

@doganmeh
私はあなたが546に向かっおいる方向が奜きです。 それが助けになるなら、私は残りのナニットを調べお、今週末にこれらのフォヌルバックのためにいく぀かのテストを曞く時間があるはずです。

接線䞊。 「Djangoのバック゚ンドの匷制」に぀いおのあなたのコメントは、私を混乱させたすが、それはたた私に考えを䞎えたした。 バック゚ンドは奜きなように動䜜できたす。 GuardianのObjectPermissionBackendに関する最初の懞念は、AuthのModelBackendず䞀緒に実行するように蚭蚈されおいるこずを瀺唆するドキュメントに由来しおいたす。 Guardianは、耇数のバック゚ンドを提䟛できたす。1぀はModelBackendで動䜜するように蚭蚈されおおり、もう1぀は単独で動䜜するように蚭蚈されおいたす。 ぀たり、1぀はGuardianのUserObjectPermission / GroupObjectPermissionテヌブルをチェックするだけで、もう1぀はUserObjectPermission / GroupObjectPermissionテヌブルずAuthのPermissionテヌブルの䞡方をチェックしたす。
個人的には、蚭定ずkwargsを䜿甚した珟圚のアプロヌチを奜みたす。 マルチバック゚ンドアプロヌチの䞻な欠点は、ショヌトカットず䟿利な関数がどのように動䜜するかが䞍明確になるこずだず思いたす。

Djangodevメヌリングリストぞの投皿を芋たした。 圌らがそれを受け入れるか、互換性のない方法で動䜜を倉曎するこずに同意するこずを願っおいたす。 APIの珟圚の制限は、䞍栌奜です。

そこでサポヌトしおもらえたすか 😊

Mail for Windows10から送信

差出人airstandley
送信日2018幎1月12日金曜日12:06 PM
宛先django-guardian / django-guardian
CcMehmet Dogan; 蚀及
件名Re[django-guardian / django-guardian] user.has_perm "perm"、objが予期しない動䜜をする49

Djangodevメヌリングリストぞの投皿を芋たした。 圌らがそれを受け入れるか、互換性のない方法で動䜜を倉曎するこずに同意するこずを願っおいたす。 APIの珟圚の制限は、䞍栌奜です。
—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺するか、スレッドをミュヌトしおください。

この問題に玄1週間察凊した埌、各バック゚ンドが1぀のこず、぀たりGuardianのオブゞェクト暩限を実行するだけでよいず確信するようになりたした。 そのためには、Djangoはobjをより適切に凊理する必芁がありたす。

そのためにDjangoに送信したパッチがありたす https //github.com/django/django/pull/9581可胜であればコメントしおください。 それを実珟するものは、Guardianにあるずころならどこでもモデル暩限の取埗をクリヌンアップし、デフォルトのバック゚ンドを呌び出すだけです。

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

関連する問題

ad-m picture ad-m  Â·  13コメント

johnthagen picture johnthagen  Â·  9コメント

BenDevelopment picture BenDevelopment  Â·  5コメント

g-as picture g-as  Â·  10コメント

lukaszb picture lukaszb  Â·  14コメント