Pregunta

He estado explorando los detalles de Django durante aproximadamente una semana y me gusta lo que veo. Sin embargo, he encontrado algo de ... negatividad en relación con el control detallado de los permisos a la interfaz CRUD.

Lo que estoy escribiendo es una aplicación web de administración de clientes de Intranet. La organización tiene aproximadamente 6 niveles, y debo restringir el acceso a los grupos de clientes en función de los niveles. Continuamente en expansión. Tengo una idea bastante clara de cómo voy a hacer esto, pero no estoy seguro de si podré integrarlo bien en la interfaz de administrador pre-construida.

He hecho absolutamente cero el desarrollo de Django, de lo contrario probablemente tendría una mejor idea de si esto funcionaría o no. Probablemente no use Django si la interfaz de administración generada no va a ser útil para este proyecto, pero como dije, existe una gran dependencia de los permisos personalizados específicos.

¿Django me permitirá crear reglas / permisos personalizados e integrarlos a la perfección en la interfaz CRUD del administrador?

Actualización uno: quiero usar la aplicación de administración para minimizar la repetición de la generación de interfaces CRUD, así que sí lo considero imprescindible.

Actualización dos:

Quiero describir los permisos necesarios para este proyecto.

Un cliente puede pertenecer a una o varias 'tiendas'. Los empleados a tiempo completo solo deberían poder editar clientes en su tienda (incluso si pertenecen a otra tienda). Sin embargo, no deberían poder ver / editar clientes en otra tienda. Los usuarios informales solo deberían poder ver a los clientes según la tienda en la que están registrados (o si el usuario informal está registrado como usuario de la tienda, es más probable).

La administración superior a ellos debe poder ver a todos los empleados de las tiendas que administran, nada más.

La alta gerencia debería poder editar TODOS los empleados y otorgar permisos debajo de ellos mismos.

Después de leer la documentación de django, dice que no puedes (automáticamente) establecer permisos para un subconjunto de un grupo. Sólo todo el grupo. ¿Es lo suficientemente fácil imitar sus propios permisos para este propósito?

¿Fue útil?

Solución

Si leo sus requisitos actualizados correctamente, no creo que el sistema de autenticación existente de Django sea suficiente. Parece que necesitas un sistema ACL completo.

Este tema ha surgido varias veces. Intenta googlear en django + acl.

Muestreos aleatorios ...

Hace un par de años hubo un proyecto de Summer of Code, pero no estoy seguro de a dónde llegaron. Consulte http://code.djangoproject.com/wiki/GenericAuthorization

Hay un boleto nuevo en djngoproject.org que podría ser interesante:

Hay algunos fragmentos de código interesantes en dumpz.org:

... pero hay cero documentos.

¡Buena suerte!

Otros consejos

El sistema de permisos Django gobierna totalmente. Cada modelo tiene un conjunto predeterminado de permisos. También puede agregar nuevos permisos a sus modelos.

Cada usuario tiene un conjunto de permisos, así como membresías de grupo. Los usuarios individuales pueden tener permisos individuales. Y heredan los permisos de su pertenencia a un grupo.

Sus funciones de visualización (y sus plantillas) pueden verificar fácilmente la presencia o ausencia de esos permisos en cualquier nivel de granularidad que necesite usar.

Y si esto no es suficiente para usted, el complemento de Perfil le brinda aún más opciones para definir un " Usuario " y sus capacidades, permisos, roles, responsabilidades, etc.

Y si esto no es suficiente para usted, puede definir sus propios esquemas de autenticación.


Lo importante es no tratar de definir grupos que sean subconjuntos reales de usuarios, no títulos o roles definidos por casualmente . Nunca es necesario que " establezca permisos para un subconjunto de un grupo " ;. Necesitas tener grupos más pequeños. Grupos definidos en torno a subconjuntos de personas.

Los permisos predeterminados de Django se refieren al acceso al modelo, no al acceso a filas dentro de un modelo. Por otro lado, su problema es sobre subconjuntos de filas en varios modelos: Cliente, Tienda, Empleado, Administrador.

Necesitará un conjunto básico de FK entre estos elementos, y algunos filtros para subcontratar las filas. Puede tener problemas para hacer esto con las páginas de administración predeterminadas. Es posible que necesite su propia versión de administrador para hacer uso de filtros especializados.


Si no puede hacerlo con el sistema de permisos de Django, debe repensar sus casos de uso. En serio.

[La interfaz Django-REST, sin embargo, es otra bestia por completo, y requiere un poco de cuidado y alimentación.]

ModelAdmin tiene objetos Métodos de has_add_permission , has_change_permission , has_delete_permission y queryset que se pueden usar para hacer cumplir los permisos sobre lo que el usuario registrado puede ver y modificar: puede crear una subclase que los use para hacer cumplir los permisos que quiera implementar y registrar todos sus modelos con la aplicación admin usando su subclase.

Sin embargo, todo depende de cómo funcionará exactamente su sistema de permisos. ¿Cuáles son los requisitos exactos que se excluyen de sus permisos específicos? Cuanto más se aleje de lo que se diseñó para hacer la aplicación admin , más trabajo le llevará, pero hay muchos enganches que puede usar para implementar sus requisitos personalizados. Aquí hay una publicación de blog de Luke Plant que da ejemplos de algunas de las multas la afinación se puede hacer sin tener que profundizar demasiado.

¿Tiene que estar absolutamente basado en la aplicación admin ? Vistas genéricas y ModelForms puede encargarse de una gran cantidad de los tediosos fragmentos involucrados en implementar CRUD, por lo que desconfíe de no estar demasiado atento a la personalización de admin : es casi una tradición de Django comenzar por colgarse de la aplicación admin y lo que puede y no puede hacer, pensando inicialmente que nunca más tendrá que escribir ningún código ;)

Desde django 1.2 hay soporte para permisos de nivel de fila, que django-guardian hace Muy intuitivo de manejar.

También es posible que desee echar un vistazo al monkeypatch de permisos granulares: http://code.google.com/p/django-granular-permissions/

Agrega permisos de nivel de fila al sistema de permisos de django.

Acabo de encontrar http://bitbucket.org/jezdez/django-authority/ , parece prometedor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top