Django-guardian: グローバル権限とオブジェクト権限

作成日 2015年12月22日  ·  16コメント  ·  ソース: django-guardian/django-guardian

グローバル権限を使用するルーチンもあれば、オブジェクト権限のみを使用するルーチンもあるため、多くのバグがあるようです。 関連するバグを閉じて、ここで参照します。

API change Enhancement

全てのコメント16件

はい、これに!

permit_required_or_403にはaccept_global_permsパラメーターがありますが、ビューでget_obj_permsを使用して同じことを行う方法はありません。

グローバルパーマを含むget_obj_perms_with_globalタグを提案します。

あなたがすでにこの道を歩み始めているかどうかはわかりませんが、それを行うためのパッチの作成を開始します。 すでに開始している場合は、遠慮なく私を止めてください:)

PSデフォルトの動作はグローバル権限を含めるべきであるという議論があると思いますが、「ユーザーXはオブジェクトZに対してYを実行できますか」と尋ねると、ユーザー/オブジェクト、グループ/オブジェクトのすべてをチェックすることを意味するようです。 、ユーザー/グローバル、グループ/グローバル権限。 しかし、それは私がそれを使用する方法のためだけかもしれません。

そうは言っても、グローバル権限を個別に確認するのは非常に簡単です...うーん。

Pesticles:これがどれほど混乱しているのかを証明するものとして、保護者には十分な問題があります。 私たちは6か月ごとにそれを少しずつ取得します... request.user.has_access( 'foo'、obj)がグローバルなアクセス許可を持っているが、オブジェクトレベルのアクセス許可を持っていない場合はtrueである必要があります。 小切手を2回書くのは面倒です。

これを変更するには何が必要ですか?

誰かがプルリクエストを書く必要があると思います...理想的には、既存のコードを壊さないような方法で(これが正気で実行可能かどうかはわかりません)。

古い問題ですが、プルリクエストはまだ表示されていません。 これに関するニュースはありますか? 私は同じ振る舞いに遭遇していますが、それはあまり予測できないと思います。 本当にありがとう!

オブジェクトレベルが失敗したときにグローバルにフォールバックするかどうか、およびどのようにフォールバックするかという問題についてより多くの洞察が得られたので、#49にいくつかのコメントを追加しました。 クローズされた問題で通知が発生するかどうかわからないため、ここに追加します。

行われている設計上の決定に応じて、私はこれらの問題のいくつかに取り組むつもりです。

これらの問題について喜んでお手伝いさせていただきます。

327は私に固定されているようです。

`` `
brandon = Person.objects.get(first_name = 'BRANDON')
brandon.is_superuser
NS

school = School.objects.get(pk = 1)

get_users_with_perms(school、attach_perms = True、with_superusers = False、with_group_users = False)
{}

assign_perm( 'add_school'、brandon、school)

get_users_with_perms(school、attach_perms = True、with_superusers = False、with_group_users = False)
{{:['add_school']}

mehmet = Person.objects.get(first_name = 'Mehmet')
mehmet.is_superuser
NS

get_users_with_perms(school、attach_perms = True、with_superusers = True、with_group_users = False)
{{:[]、:['add_school'、 'change_school'、 'delete_school']}

assign_perm( 'add_school'、mehmet、school)

get_users_with_perms(school、attach_perms = True、with_superusers = True、with_group_users = False)
{{:[]、:['add_school'、 'change_school'、 'delete_school']}

get_users_with_perms(school、attach_perms = True、with_superusers = False、with_group_users = False)
{{:['add_school']、:['add_school']}

#155:

get_obj_perms_field_choices (self)次の2行の追加が要求されます:

        if self.exclude_default:
            choices = list(set(choices).intersection(self.obj._meta.permissions))

モデルのデフォルトの権限を除外します。 まず、 intersectionがそれをどのように行うのかはっきりしていません。 第二に、それはオブジェクトとモデルの権限に関連していないようです。 足りないものがあれば訂正してください。

しかし、それを調べていると、次の点でオブジェクトとモデルのアクセス許可を分離する必要があることに気付きました。

    def save_obj_perms(self):
        """
        Saves selected object permissions by creating new ones and removing
        those which were not selected but already exists.

        Should be called *after* form is validated.
        """
        perms = self.cleaned_data[self.get_obj_perms_field_name()]
        model_perms = [c[0] for c in self.get_obj_perms_field_choices()]

        to_remove = set(model_perms) - set(perms)
        for perm in to_remove:
            remove_perm(perm, self.user, self.obj)

        for perm in perms:
            assign_perm(perm, self.user, self.obj)

欠落しているアクセス許可はすべてオブジェクトレベルで保存しているようですが、私の意見では、モデルレベルで使用可能なアクセス許可はスキップするか、そのためのオプションを提供する必要があります。

オブジェクトのアクセス許可とモデルのアクセス許可を適切に描写するには、 GUARDIAN_FALLBACK_TO_MODEL=Falseなどのグローバル設定とfallback_to_model=Falseなどの適用可能なメソッドへの引数が必要だと思います。 デフォルト値のFalseは、下位互換性を保証します。 グローバル設定または引数設定のいずれかがTrueの場合、フォールバックを実行する必要があります。

GUARDIAN_FALLBACK_TO_MODELの場合は+1。

#49の説明によると、ObjectPermissionBackendが明示的であるかどうかを制御するには、設定も適切に機能する可能性があると思います。

プルリクエストを作成しました(#546)。 これにより、core.pyオプションのチェッカー関数をモデルレベルのアクセス許可にフォールバック(または含める)できます。 他のモジュールもレビューする必要があります。 使用しながらレビューする予定です。 誰かが飛び込みたいのなら、大歓迎です。

#327はもう存在しないようです。 #332は、受け入れられた場合、上記のプルリクエストによって修正されます。 #155(上記)に関連する1つの副次的な問題が残っています。 それも処理された(または別の問題に移された)場合、この問題は解決される可能性があると思います。

設定されている場合、グローバル権限はオブジェクトレベルの権限に対して引き続き尊重されませんが、ここで間違っていますか?

u = User.objects.get(id=1)
c = Client.objects.get(id=1)
assign_perm('core.change_client', u)
u = User.objects.get(id=1)  # reloading user for perm refresh
u.has_perm('core.change_client')  # True
u.has_perm('core.change_client', c)  # False
u.has_perm('change_client', c)  # False
get_perms(u, c)  # []

そして、 GUARDIAN_GLOBAL_PERMISSIONS_CARRY_OVERまたはFALLBACK_TO_MODELは何をしますか? どちらも文書化されていないようです。

これをcore.pyに追加するだけで十分ではないでしょうか。

get_user_perms:126これはすべてのユーザー権限チェックの中心であるようです。 または、ブールフラグを使用してトリガー可能

def get_user_perms(self, obj):
    # ....
    user_global_perms = Permission.objects.filter(content_type=ctype)\
                                        .filter(user=self.user)\
                                        .values_list('codename', flat=True)
    user_object_perms = user_perms_qs.values_list("codename", flat=True)
    user_perms = list(chain(user_global_perms, user_object_perms))
    return user_perms
このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

David-OConnor picture David-OConnor  ·  6コメント

Allan-Nava picture Allan-Nava  ·  35コメント

xuhcc picture xuhcc  ·  10コメント

lukaszb picture lukaszb  ·  14コメント

johnthagen picture johnthagen  ·  9コメント