[Django] Permissions gegen auth.models.Permission prüfen
Verfasst: Mittwoch 17. April 2013, 10:14
Ich habe in einem meiner Modelle folgendes definiert:
Jedem Special werden damit also Berechtigungen zugewiesen.
Mir geht es darum, dass nur spezielle Benutzer, die eben diese ausgewählten Berechtigungen haben, etwas Bestimmtes mit einem Special anfangen dürfen.
Dafür müsste ich also die hinterlegten Berechtigungen gegen die des Benutzers prüfen, da stecke ich aber leider fest.
Das hier sah mir am erfolgversprechendsten aus, funktioniert aber leider nicht (user.has_perm(permission) ist immer False, auch wenn der Benutzer die Berechtigung hat):
Irgend etwas habe ich falsch verstanden. Sind das nicht die Permissions, die man mit has_perm prüfen kann?
Edit: Oh, ich sehe gerade, dass user.has_perm einen String erwartet. Dann hätte ich aber gedacht, dass folgendes tut:
Ich habe das jetzt so gelöst, dass ich mir User.user_permissions und aus den Gruppen User.groups.permissions geholt habe, und gegen die Prüfe. Das funktioniert zwar, fühlt sich aber seltsam an.
Code: Alles auswählen
from django.contrib.auth.models import Permission
class Special(models.Model):
permissions = models.ManyToManyField(Permission)
Mir geht es darum, dass nur spezielle Benutzer, die eben diese ausgewählten Berechtigungen haben, etwas Bestimmtes mit einem Special anfangen dürfen.
Dafür müsste ich also die hinterlegten Berechtigungen gegen die des Benutzers prüfen, da stecke ich aber leider fest.
Das hier sah mir am erfolgversprechendsten aus, funktioniert aber leider nicht (user.has_perm(permission) ist immer False, auch wenn der Benutzer die Berechtigung hat):
Code: Alles auswählen
special = Special.objects.get(id=1)
for permission in special.permissions.all():
if user.has_perm(permission):
return True
return False
Edit: Oh, ich sehe gerade, dass user.has_perm einen String erwartet. Dann hätte ich aber gedacht, dass folgendes tut:
Code: Alles auswählen
Special.objects.get(id=1)
user_permissions = user.get_all_permissions()
for permission in special.permissions.all():
if permission in user_permissions:
return True
return False