2010-08-22 7 views
6

Ich versuche, einige benutzerdefinierte Berechtigungen für eine Django-Anwendung einzurichten, aber es scheint nicht zu funktionieren. Die offizielle Dokumentation ist ein bisschen dürftig und erwähnt nicht (zumindest, dass ich finden kann), wie man eine Erlaubnis wirklich setzt? Basierend auf einigen 3rd-Party-Tutorials, die ich gefunden habe ich die User-Klasse erweitert und es scheint gut zu funktionieren:Ich kann keine benutzerdefinierten Berechtigungen in Django setzen

from django.db import models 
from django.contrib.auth.models import User,UserManager 

    class CustomUser(User): 
     custom_field = models.CharField(max_length=250) 
     objects = UserManager() 

     class Meta: 
      permissions = (
       ('is_custom','Has a Custom Permission'), 
      ) 

Wenn ich versuche jedoch eine Erlaubnis zu setzen, funktioniert es nicht:

>>> from project.custauth.models import CustomUser 
>>> from django.contrib.auth.models import User, Permission 
>>> user = CustomUser.objects.get(username='new.user') 
>>> user 
<CustomUser: new.user> 
>>> custom_permission = Permission.objects.get(codename="is_custom") 
>>> custom_permission 
<Permission: custauth | custom user | Has a Custom Permission> 
>>> custom_permission.save() 
>>> user.user_permissions.add(custom_permission) 
>>> user.save() 
>>> user.has_perm(custom_permission) 
False 
>>> user.get_all_permissions() 
set([]) 

Irgendwelche Ideen, was ich falsch mache? Ich benutze Django 1.2.1 mit Python 2.4.3. Alle Eingaben geschätzt ...

+1

Falls jemand auf der Suche nach der Lösung kommt, fand ich das hilfreich: http://stackoverflow.com/questions/10102918/cant-change-user-permissions-during-unittest-in-django – sid

Antwort

1

Ich habe Ihren Code getestet (Python 2.6.2, Django 1.2.1) und alles hat wie erwartet funktioniert. Können Sie einen Komponententest schreiben, um dasselbe Code-Snippet auszuprobieren?

Auf einer Seitennotiz user.has_perm(custom_permission) wird nicht zurückgegeben True. Versuchen Sie user.has_perm('app.is_custom').

aktualisieren

-Code-Schnipsel folgt:

In [1]: from app.models import CustomUser 

In [2]: from django.contrib.auth.models import User, Permission 

In [3]: user = CustomUser.objects.get(username = 'new.user') 

In [4]: custom_permission = Permission.objects.get(codename='is_custom') 

In [5]: user.user_permissions.add(custom_permission) 

In [6]: user.save() 

In [7]: user.has_perm(custom_permission) 
Out[7]: False 

In [8]: user.has_perm('app.is_custom') 
Out[8]: True 

In [9]: user.get_all_permissions() 
Out[9]: set([u'app.is_custom']) 
+0

Ich werde auf jeden Fall behalten der Hinweis re: has_perm() im Hinterkopf. Vielen Dank. Ich habe noch die Testfunktionen von Django zu verwenden (es ist eine ziemlich einfache App, also teste ich gerade, wie ich gehe). Wäre es von Vorteil, wenn Sie nur die manage.py-Shell verwenden? In jedem Fall ist das Problem, dass user.get_all_permissions() eine leere Menge zurückgibt. Ich habe bemerkt, dass Sie eine neuere Version von Python verwenden, also habe ich es mit 2.6.5 versucht, sehe aber immer noch das gleiche Verhalten. Hast du ein leeres Set? Wenn nicht, würde es Ihnen etwas ausmachen, den Code, den Sie verwendet haben, zu kopieren, damit ich sehen kann, ob es Unterschiede gibt? Danke. – Sparky

+0

(1) Ich ziehe es vor, Komponententests aus zwei Gründen zu schreiben: keine anhaltenden Nebenwirkungen der Datenbank, da die Testdatenbank jedes Mal abgebrochen wird; nützlich um Regression später zu verhindern (2) Ich habe keinen leeren Satz bekommen. Ich werde meine Antwort aktualisieren, um den Code, den ich verwendet habe, zu posten. –

0

ich auf einer anderen Plattform einige Tests gemacht und war in der Lage, Ihre Ergebnisse zu replizieren. Nach weiteren Ausgrabungen habe ich festgestellt, dass es sich um ein Problem mit dem Authentifizierungs-Back-End handelt und nicht um die Berechtigungen selbst.

Vielen Dank für Ihre Hilfe Manoj.