2012-01-21 21 views
6

¿Cómo se asegura de que un usuario solo pueda editar objetos que haya creado? ¿Cuál es la mejor manera de configurar esto?permisos de nivel de objeto django

Estoy usando django-rest-framework y me pregunto si hay alguna forma de que pueda restringir a los usuarios la visualización/edición de objetos que no son "propios".

class Video(models.Model): 
    owner = models.ForeignKey(User) 
    ... 

Así usuario 'X' sólo debe ser capaz de editar vídeos en su owner_set.

+0

¿Cómo se define el usuario "propiedad" de un objeto? Incluya suficientes modelos para que podamos ver de lo que está hablando. –

+0

@ S.Lott recién actualizado para incluir esto. –

Respuesta

2

Es de suponer que tiene sesiones y el modelo de autenticación activado.

Debe asegurarse de que todas las vistas (REST y sin REST) ​​requieren autenticación.

Para no REST, es fácil. Simplemente use un decorador básico @login-required en todas partes.

Para el marco Django-REST, lea esto: http://django-rest-framework.org/library/authentication.html#module-authentication.

Debe usar la combinación de autenticación para asegurarse de que la autenticación realmente ocurrió.

El marco es compatible con la autenticación BASIC, que requiere una conexión SSL para estar seguro. No es demasiado difícil implementar la autenticación DIGEST, que no requiere SSL.

Evite las sesiones. Viola el principio de REST para iniciar sesión y cerrar sesión. El marco admite sesiones, pero es menos que ideal.

Una vez que haya autenticado todas las solicitudes, conocerá al usuario.

Si conoce al usuario, entonces user.video_set funciona perfectamente. También puede usar Video.objects.filter(...) para asegurarse de consultar al usuario, pero es más fácil confirmar que el código es correcto si trabaja con user.video_set.get(...) o user.video_set.filter() o lo que sea.

Todas las comprobaciones de autorizaciones relevantes se realizan en Vistas. Estás proporcionando vistas para tus recursos de modelo.

Estas son "vistas basadas en clase". La documentación está aquí: https://docs.djangoproject.com/en/dev/topics/class-based-views/#viewing-subsets-of-objects

El truco consiste en seleccionar todos los mezcladores y serializadores correctos.

Por ejemplo, se puede mezclar conseguir el procesamiento de esta manera:

http://django-rest-framework.org/howto/mixin.html

podrás aplicar el filtro en el get método

+1

¡Muchas gracias por la respuesta completa! Todavía me pregunto dónde está el lugar apropiado para poner el código que filtra según el usuario. Solo comencé a usar Django-REST y estoy teniendo problemas para resolverlo ... –

Cuestiones relacionadas