Python | Grupos de usuarios con permisos personalizados en Django

Consideremos un servicio de reserva de viajes, cómo funcionan con diferentes planes y paquetes. Hay una lista de productos que el suscriptor obtiene al suscribirse a diferentes paquetes, proporcionados por la empresa. Generalmente, la idea que siguen es la distribución nivelada de los diferentes productos.

Veamos los diferentes paquetes disponibles en el servicio de reserva de tours:

  1. Plan de inicio : en este paquete, el suscriptor obtendrá la facilidad de viajar en autobús sin aire acondicionado y una estadía de 1 día en una habitación sin aire acondicionado solamente. Digamos que el viaje es de Delhi a Haridwar (un lugar religioso en Uttarakhand).
  2. Plan Dorado : Será algo más costoso que el Plan Starter. En este plan, el suscriptor recibirá una estadía de 2 días en una habitación sin aire acondicionado, viajará en un autobús con aire acondicionado y el viaje será desde Delhi a Haridwar, Rishikesh y Mussoorie.
  3. Plan Diamond : este es el plan más costoso, en el que el suscriptor recibirá un plan de 3 días con autobús AC y estadía en la habitación AC, junto con el viaje a Haridwar, Rishikesh y Mussoorie y también un viaje al parque acuático.

Nuestro principal objetivo es diseñar y escribir código para el back-end de una manera muy eficiente (siguiendo el Principio DRY ).
Existen múltiples métodos para implementar esto en Django, pero el método más adecuado y eficiente es agrupar a los usuarios y definir los permisos de estos grupos. El usuario de ese grupo en particular heredará automáticamente el permiso de ese grupo en particular. Primero definamos el modelo de usuario:

Crear usuarios de una aplicación Django . En el archivo models.py, en el directorio de la aplicación ‘usuarios’, escriba este código.  

Python3

# importing necessary django classes
from django.contrib.auth.models import AbstractUser
from django.utils import timezone
from django.db import models
 
# User class
class User(AbstractUser):
 
    # Define the extra fields
    # related to User here
    first_name = models.CharField(_('First Name of User'),
                            blank = True, max_length = 20)
                             
    last_name = models.CharField(_('Last Name of User'),
                            blank = True, max_length = 20)
                             
# More User fields according to need
 
    # define the custom permissions
    # related to User.
    class Meta:
         
        permissions = (
            ("can_go_in_non_ac_bus", "To provide non-AC Bus facility"),
            ("can_go_in_ac_bus", "To provide AC-Bus facility"),
            ("can_stay_ac-room", "To provide staying at AC room"),
            ("can_stay_ac-room", "To provide staying at Non-AC room"),
            ("can_go_dehradoon", "Trip to Dehradoon"),
            ("can_go_mussoorie", "Trip to Mussoorie"),
            ("can_go_haridwaar", "Trip to Haridwaar"),
            ("can_go_rishikesh", "Trip to Rishikesh"),
 
# Add other custom permissions according to need.

  
Después de migrar los modelos escritos arriba, tenemos dos opciones para hacer el grupo.

  1. Panel de administración de Django : en el Panel de administración verá Grupo en negrita, haga clic en eso y haga 3 grupos diferentes llamados level0, level1, level3. Además, defina los permisos personalizados según la necesidad.
  2. Mediante la creación programática de un grupo con permisos : abra el shell de python usando el shell de python manage.py.

Python3

# importing group class from django
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
 
# import User model
from users.models import User
 
new_group, created = Group.objects.get_or_create(name ='new_group')
 
# Code to add permission to group
ct = ContentType.objects.get_for_model(User)
 
# If I want to add 'Can go Haridwar' permission to level0 ?
permission = Permission.objects.create(codename ='can_go_haridwar',
                                        name ='Can go to Haridwar',
                                                content_type = ct)
new_group.permissions.add(permission)

 
Estableceremos diferentes conjuntos de permisos de la misma manera para los tres grupos. Hasta entonces, hemos hecho grupos y los hemos vinculado con permisos personalizados.

Ahora, verifique que un usuario en particular esté accediendo a la funcionalidad adecuada, como poner un límite para que el nivel 0 no acceda a las funcionalidades de los usuarios de nivel 1 o del usuario de nivel 2, etc. Para hacer esto, verifique el permiso en cada función de visualización realizada.
Para tener mucho cuidado aquí, para la vista basada en funciones simplemente usaremos el decorador personalizado. 

Por ejemplo :  

Python

@group_required('level0')
def my_view(request):
    ...

Para obtener más detalles, consulte este .
Las cosas se vuelven un poco complejas cuando hablamos de vistas basadas en clases, no podemos simplemente agregar una función de decorador, sino que tenemos que crear una clase de combinación de permisos.

Por ejemplo :  

Python

class GroupRequiredMixin(object):
    ...............
    ....Class Definition.....
 
 
class DemoView(GroupRequiredMixin, View):
  group_required = [u'admin', u'manager']
   
  # View code...

Para obtener más detalles, consulte este .

Referencias: 
1. https://docs.djangoproject.com/en/1.11/topics/class-based-views/mixins/ 
2. http://bradmontgomery.blogspot.in/2009/04/restricting-access-by- group-in-django.html 
3. https://simpleisbetterthancomplex.com/2015/12/07/working-with-django-view-decorators.html 
4. https://micropyramid.com/blog/custom-decorators- para-comprobar-los-roles-y-permisos-de-usuario-en-django/
 

Publicación traducida automáticamente

Artículo escrito por Mannu Gupta 1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *