16

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.Django - ¿permisos de usuario para ciertas vistas?

Eso es genial, pero también necesito permitir que un usuario o grupo de usuarios acceda 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 que ciertos usuarios/grupos de usuarios accedan a ciertas vistas? ¡Gracias!

Respuesta

22

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

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

Se puede añadir un permiso a un modelo como este:

# myproject/myapp/models.py 

class MyModel(models.Model): 
    class Meta: 
     permissions = (
      ('permission_code', 'Friendly permission description'), 
     ) 

entonces usted puede comprobar a si un usuario tiene permiso de la siguiente manera:

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

Uso de permisos a continuación, puede agregar fácilmente o eliminarlos de los usuarios y grupos simplemente usando la interfaz de administración.

+0

Sí, me refiero a las vistas personalizadas que he creado, no el administrador. – avatar

+0

Gracias. Lo probaré. Parece relativamente fácil. – avatar

+0

@permission_required sería más fácil y más elegante aquí – Manur

9

Debe administrarlo 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 permission_required, si es una simple cuestión de si el usuario tiene un Permiso 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... 

suponiendo que is_allowed_to_see_view_myview es algún tipo de método en el objeto de usuario.

Las authentication docs son bastante completas.

1

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

A. Si sus puntos de vista están relacionados con algún modelo específico, use permisos personalizados en ese modelo, como sugirió Marcus Whybrow.

B. [no probado, puede que no funcione] Subclases User y defina sus propios permisos allí. No es necesario modelo real, es sólo envoltura para el permiso de encargo 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 se olvide de ejecutar syncdb para agregar permisos personalizados a la base de datos.

+0

A partir de Django 1.3 no hay forma de subclasificar al usuario. (aparte de usar AUTH_PROFILE_MODULE, pero eso no ayuda aquí). – SystemParadox

1

Para las vistas basadas clase puede heredar UserPassesTestMixin clase 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') 

Tome un vistazo a this docs para más detalles sobre cómo utilizar este:

+0

Información importante, es la característica de django bastante reciente (versiones 1.9+) – Drachenfels

Cuestiones relacionadas