Django-guardian: Globale Berechtigungen vs. Objektberechtigungen

Erstellt am 22. Dez. 2015  ·  16Kommentare  ·  Quelle: django-guardian/django-guardian

Es scheint eine Reihe von Fehlern zu geben, da einige Routinen globale Berechtigungen verwenden und andere nur Objektberechtigungen verwenden. Schließt die zugehörigen Fehler und referenziert sie hier.

API change Enhancement

Alle 16 Kommentare

Ja dazu!

permission_required_or_403 hat den Parameter accept_global_perms, aber es gibt keine Möglichkeit, dasselbe mit get_obj_perms zu tun

Ich schlage ein get_obj_perms_with_global-Tag vor, das globale Perms enthält.

Ich weiß nicht, ob Sie bereits damit begonnen haben, aber ich werde damit beginnen, einen Patch auszuarbeiten; wenn du schon angefangen hast, kannst du mich gerne aufhalten :)

PS Ich denke, es gibt ein Argument, dass das Standardverhalten darin bestehen sollte, globale Berechtigungen einzubeziehen , Benutzer-/Global-, Gruppen-/Global-Berechtigungen. Aber vielleicht liegt es auch an der Art und Weise, wie ich es verwende.

Abgesehen davon ist es ziemlich einfach, globale Berechtigungen separat zu überprüfen ... Hmmmm.

Pestikel: Es gibt genug Probleme mit dem Guardian, um zu belegen, wie verwirrend das ist. Wir werden alle sechs Monate davon gebissen ... if request.user.has_access('foo', obj) sollte wahr sein, wenn sie globale Berechtigungen haben, aber keine Berechtigungen auf Objektebene. Den Scheck zweimal zu schreiben ist eklig.

Was muss passieren, damit sich das ändert?

Ich denke, jemand muss eine Pull-Anfrage schreiben... Idealerweise so, dass der vorhandene Code nicht beschädigt wird (ob dies vernünftig und machbar ist oder nicht, weiß ich nicht).

Altes Problem, aber ich sehe noch keinen Pull-Request. Gibt es Neuigkeiten zu diesem? Ich stoße auf das gleiche Verhalten, das meiner Meinung nach nicht sehr vorhersehbar ist. Vielen Dank!

Ich habe #49 einige Kommentare hinzugefügt, da dies mehr Einblick in die Frage gab, ob und wie auf Globals zurückgegriffen werden kann, wenn die Objektebene fehlschlägt. Ich bin mir nicht sicher, ob geschlossene Probleme eine Benachrichtigung auslösen, daher füge ich dies hier hinzu.

Abhängig von den getroffenen Designentscheidungen habe ich die Absicht, an einigen dieser Themen zu arbeiten.

Bei diesen Problemen helfe ich gerne.

327 scheint mir behoben.

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

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
Wahr

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']}

Auf #155:

Das Hinzufügen der folgenden zwei Zeilen zu get_obj_perms_field_choices (self) wird angefordert:

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

um die Standardberechtigungen des Modells auszuschließen. Erstens ist mir nicht klar, wie intersection das tun würde. Zweitens scheint dies nicht mit Objekt- oder Modellberechtigungen zu tun zu haben. Bitte korrigiert mich, wenn ich etwas übersehe.

Aber als ich das untersuchte, bemerkte ich, dass es eine Trennung von Objekt- und Modellberechtigungen geben muss in:

    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)

Es scheint, als würde auf Objektebene jede fehlende Berechtigung gespeichert, während meiner Meinung nach jede auf Modellebene verfügbare Berechtigung übersprungen oder eine Option zu diesem Zweck bereitgestellt werden sollte.

Ich denke, dass eine globale Einstellung wie GUARDIAN_FALLBACK_TO_MODEL=False und ein Argument für anwendbare Methoden wie fallback_to_model=False erforderlich sind, um Objektberechtigungen und Modellberechtigungen richtig abzugrenzen. Der Standardwert False gewährleistet die Abwärtskompatibilität. Wenn entweder die globale oder die Argumenteinstellung True ist, sollte ein Fallback stattfinden.

+1 für GUARDIAN_FALLBACK_TO_MODEL.

Gemäß der Diskussion zu #49 denke ich, dass diese Einstellung auch gut funktionieren könnte, um zu steuern, ob das ObjectPermissionBackend explizit war oder nicht.

Ich habe eine Pull-Anfrage erstellt (#546). Es ermöglicht Prüffunktionen in der Option core.py, auf Berechtigungen auf Modellebene zurückzugreifen (oder diese einzuschließen). Auch andere Module müssen überprüft werden. Ich plane, sie zu überprüfen, während ich sie verwende. Wenn jemand einsteigen möchte, herzlich willkommen.

Es scheint, dass #327 nicht mehr existiert. #332 wird durch die obige Pull-Anfrage behoben, wenn sie akzeptiert wird. Es gibt nur noch ein Nebenproblem im Zusammenhang mit #155 (oben erwähnt). Wenn das auch erledigt würde (oder in eine separate Ausgabe verschoben wurde), könnte diese Ausgabe, denke ich, geschlossen werden.

Globale Berechtigungen werden immer noch nicht für Berechtigungen auf Objektebene berücksichtigt, wenn sie festgelegt sind. Liege ich hier falsch?

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)  # []

Und was bewirkt die Einstellung von GUARDIAN_GLOBAL_PERMISSIONS_CARRY_OVER oder FALLBACK_TO_MODEL ? Beides scheint nicht dokumentiert zu sein.

Wäre es nicht ausreichend, dies zu core.py hinzuzufügen?

get_user_perms:126 die das Zentrum aller Überprüfungen der Benutzerrechte zu sein scheint; alternativ triggerbar über ein boolesches Flag

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
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

Dzejkob picture Dzejkob  ·  28Kommentare

ad-m picture ad-m  ·  13Kommentare

Allan-Nava picture Allan-Nava  ·  35Kommentare

lukaszb picture lukaszb  ·  14Kommentare

BenDevelopment picture BenDevelopment  ·  5Kommentare