2

J'utilise Django 1.9. Lorsque j'ai essayé d'ajouter PermissionRequiredMixin à ma vue basée sur la classe, il semble ne pas fonctionner comme prévu. J'ai créé un nouvel utilisateur dans un groupe auth. Ce groupe auth_group n'a aucune autorisation pour les applications ou les modèles. Ce nouvel utilisateur n'est pas un super-utilisateur ou un utilisateur admin. Mais l'application n'empêche pas cet utilisateur d'accéder à une vue particulière qui nécessite permission_required.Django - PermissionRequiredMixin avec le modèle utilisateur personnalisé ainsi que AUTHENTICATION_BACKENDS

Tout d'abord, voici ce que j'ai essayé de faire en sorte que l'utilisateur n'a pas la permission:

user.get_all_permissions() # return set() - empty permission, which is correct. 
user.is_superuser # return false, which is correct. 
user.has_perm('myapp.add_something or even any words that make no sense') # always return true, which is very weird. 

L'application a le modèle utilisateur personnalisé et utilise également django-allauth comme AUTHENTICATION_BACKENDS. Je ne suis pas sûr si PermissionRequiredMixin va vérifier user.has_perm() et il renvoie toujours vrai, c'est pourquoi la vérification de l'autorisation ne fonctionne pas comme prévu? J'ai également essayé l'ancienne méthode pour vérifier l'autorisation dans urls.py. Cela n'empêche pas l'utilisateur d'y accéder, donc je ne pense pas que ce soit le problème de l'utilisation de PermissionRequiredMixin.

urlpatterns = patterns('', 

    (r'^vote/', permission_required('polls.can_vote')(VoteView.as_view())), 
) 

Répondre

2

Après avoir passé quelques jours sur ce problème, je finis par trouver la cause.

Lorsque j'ai regardé le code source à propos de PermissionRequiredMixin, j'ai trouvé que PermissionRequiredMixin vérifie en effet user.has_perm(). Quand j'ai essayé de trouver le code source de has_perm(), je trouve que mes codes (qui est copié à partir de l'exemple de modèle utilisateur personnalisé à partir Django's document) contient la méthode surchargée suivante ...

def has_perm(self, perm, obj=None): 
     "Does the user have a specific permission?" 
     # Simplest possible answer: Yes, always 
     return True 

C'est la raison pour laquelle l'utilisateur .has_perm ('anything') renvoie toujours true, ce qui affecte également la fonctionnalité de PermissionRequiredMixin. Par conséquent, si vous êtes nouveau sur Django et que vous essayez de copier des exemples de code du document, vous devez faire très attention à chaque ligne ...

+0

J'ai cherché des jours aussi, merci dieu j'ai trouvé ça. Je ne peux pas croire qu'ils n'expliquent pas cela dans les docs – diek