2010-08-22 19 views
6

Estoy intentando configurar algunos permisos personalizados para una aplicación Django, pero parece que no funciona. La documentación oficial es un poco escasa, y no menciona (al menos eso puedo encontrar) cómo realmente establecer un permiso? Sobre la base de algunos tutoriales de 3 ª parte que he encontrado, he ampliado la clase de usuario y parece que funciona bien:No se pueden establecer permisos personalizados en Django

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'), 
      ) 

Cuando intento configurar un permiso sin embargo, no funciona:

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

¿Alguna idea sobre lo que estoy haciendo mal? Estoy usando Django 1.2.1 con Python 2.4.3. Todas las entradas apreciadas ...

+1

En caso de que alguien venga a buscar la solución, encontré esto útil: http://stackoverflow.com/questions/10102918/cant-change-user-permissions-during-unittest-in-django – sid

Respuesta

1

Probé tu código (Python 2.6.2, Django 1.2.1) y todo funcionó como se esperaba. ¿Puedes escribir una prueba unitaria para ejercitar el mismo fragmento de código?

En una nota al margen user.has_perm(custom_permission) no devolverá True. Pruebe user.has_perm('app.is_custom').

actualización

Código fragmento de la siguiente manera:

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

Definitivamente voy a mantener la sugerencia re: has_perm() en mente. Gracias. Todavía estoy por usar las características de prueba de Django (es una aplicación bastante simple, así que solo estoy probando sobre la marcha). ¿Habría algún beneficio al hacer eso solo por usar el shell manage.py? En cualquier caso, el problema es que user.get_all_permissions() devuelve un conjunto vacío. Me di cuenta de que está ejecutando una versión más nueva de Python, así que lo intenté de nuevo con 2.6.5, pero todavía veo el mismo comportamiento. ¿Obtienes un juego vacío? Si no, ¿te importaría pegar el código que usaste para ver si hay alguna diferencia? Gracias. – Sparky

+0

(1) Prefiero escribir pruebas unitarias por dos razones: no persisten los efectos colaterales de la base de datos ya que la base de datos de prueba se descarta cada vez; útil para evitar la regresión más tarde (2) No obtuve un conjunto vacío. Actualizaré mi respuesta para publicar el código que utilicé. –

0

he hecho un poco más pruebas en una plataforma diferente y era capaz de replicar sus resultados. Después de excavar más, descubrí que es un problema con el back-end de autenticación, en lugar de los permisos en sí mismos.

Gracias por su ayuda Manoj.

Cuestiones relacionadas