validacion usuarios sesiones permisos manejo grupos agregar python django django-authentication django-permissions django-login

python - usuarios - Django-¿Permisos de usuario para ciertas vistas?



roles en django (4)

Desde el administrador, veo que puede asignar permisos a un usuario o grupo de usuarios para: permitir agregar, cambiar o eliminar datos de un modelo.

Eso es genial, pero también necesito permitir que un usuario o un grupo de usuarios accedan o no a un grupo de vistas. Tengo cierto tipo de servicios en mi sitio web, por lo que quiero permitir que algunos usuarios accedan a ciertos servicios (páginas / vistas) pero no a otros.

Entonces, ¿cómo puedo permitir a ciertos usuarios / grupos de usuarios acceder a ciertas vistas? ¡Gracias!


El sistema de permisos está centrado en el modelo y supone que los permisos están vinculados a los modelos. Creo que las siguientes 2 alternativas son las mejores opciones:

R. Si sus vistas están relacionadas con algún modelo específico, use permisos personalizados en ese modelo como sugirió Marcus Whybrow.

B. [no probado, podría no funcionar] Subclases de User y defina sus propios permisos allí. No necesita un modelo real, es solo un envoltorio para el permiso personalizado de su aplicación:

from django.contrib.auth.models import User class MyUser(User): class Meta: permissions = ((''can_visit_$viewset1'', ''Can visit $view_set_1''))

No olvide ejecutar syncdb para agregar permisos personalizados a la base de datos.


Los usuarios que no pueden agregar o cambiar un modelo determinado, no podrán verlo en el administrador.

Si estamos hablando de sus vistas creadas personalizadas, entonces podría crear algo que verifique el permiso de un usuario y devuelva un 404 si no tiene ese permiso. Los permisos están vinculados a modelos y a un grupo se le pueden asignar varios permisos.

Puedes agregar un permiso a un modelo como este:

# myproject/myapp/models.py class MyModel(models.Model): class Meta: permissions = ( (''permission_code'', ''Friendly permission description''), )

Luego puedes verificar si un usuario tiene un permiso como este:

@user_passes_test(lambda u: u.has_perm(''myapp.permission_code'')) def some_view(request): # ...

Con los permisos, puede agregarlos o eliminarlos fácilmente de los usuarios y grupos simplemente usando la interfaz de administración.


Necesitas gestionar eso manualmente, pero es bastante fácil. Es de suponer que hay un atributo que determina si un grupo tiene permiso para ver una vista: entonces simplemente decora esa vista con el decorador user_passes_test el permission_required , si es una pregunta simple sobre si el usuario tiene un permiso en particular, o user_passes_test si es un poco más complicado:

@user_passes_test(lambda u: u.is_allowed_to_see_view_myview()) def myview(request): ...etc...

asumiendo que is_allowed_to_see_view_myview es algún tipo de método en el objeto User.

Los documentos de autenticación son bastante completos.


Para las vistas basadas en clases, puede heredar la clase UserPassesTestMixin en la vista y definir test_func

from django.contrib.auth.mixins import UserPassesTestMixin class MainView(UserPassesTestMixin, View): def test_func(self): return self.request.user.has_perm(''app.get_main_view'')

Eche un vistazo a esta documentación para obtener más detalles sobre cómo usar esto: