7. Autenticación, Usuario Personalizado y Seguridad 🛡️
1. Extensión del Modelo de Usuario en Django
El modelo User por defecto de Django incluye únicamente username, email, first_name, last_name y password. En aplicaciones profesionales casi siempre necesitamos datos adicionales: número de documento (RUT / DNI), teléfono, dirección, rol en el sistema o estado de cuenta.
AUTH_USER_MODEL a mitad de un proyecto en producción requiere migraciones manuales complejas para actualizar las claves foráneas existentes.1.1 Estrategias de Extensión: AbstractUser vs OneToOneField
Hereda de django.contrib.auth.models.AbstractUser. Mantiene toda la lógica nativa (hash de contraseñas, reseteo de claves, grupos y permisos) y añade nuevas columnas directamente a la tabla del usuario.
Crea un modelo satélite (ej: PerfilUsuario) enlazado mediante OneToOneField(User). Útil cuando no puedes alterar la tabla de usuarios existente en un sistema legado.
1.2 Implementación del Modelo Usuario en usuarios/models.py
Creamos una aplicación dedicada usuarios (python manage.py startapp usuarios) y definimos nuestro modelo extendido:
Luego, registramos el modelo en config/settings.py:
2. Manipulación Avanzada del Django Admin para Usuarios (UserAdmin)
No registres un modelo de usuario con un simple admin.ModelAdmin común, pues perderías los formularios especiales de Django que hashean contraseñas con algoritmos criptográficos (PBKDF2/Argon2). Debes heredar de django.contrib.auth.admin.UserAdmin:
3. Validaciones Críticas en el Administrador y Formularios
Un error común en sistemas administrativos es permitir que un superusuario se desactive a sí mismo o se quite permisos involuntariamente, bloqueando el acceso al sistema. Podemos proteger esto sobreescribiendo el formulario del admin:
4. Acciones Masivas de Administración (@admin.action)
Las acciones permiten al personal de biblioteca procesar decenas o cientos de registros simultáneamente sin tener que abrirlos uno por uno:
⚡ Laboratorio Interactivo: Simulador de Autenticación y UserAdmin
Prueba en vivo la inspección del objeto request.user, cómo reaccionan las vistas protegidas ante diferentes roles y multas, y experimenta las validaciones de auto-protección y acciones masivas del administrador.
Django Auth & UserAdmin Simulator
Prueba usuarios extendidos (AbstractUser), roles, permisos y acciones del UserAdmin
Haz clic para simular que admin_central intenta ingresar a diferentes endpoints:
6. Control de Acceso en Vistas (Decoradores y Mixins)
En Django proteges tus vistas utilizando decoradores (para funciones FBV) y mixins de herencia (para clases CBV):
7. Ejercicios Didácticos: Proyecto 1 (Biblioteca)
Pon a prueba la gestión de usuarios y permisos sobre la Biblioteca Central.
Ejercicio 7.1: Mixin de Verificación de Multas Pendientes
Crea un Mixin personalizado reutilizable para CBVs llamado SinMultasRequiredMixin que rechace con PermissionDenied (HTTP 403) a cualquier usuario que tenga multas_pendientes > 0.
Ver Solución Explicada
Ejercicio 7.2: Acción de Admin para Condonar y Reactivar
Escribe una acción para CustomUserAdmin que ponga las multas a $0.00 y restaure el estado de cuenta a 'ACTIVA'.
Ver Solución Explicada
8. Desafío Práctico: Segundo Proyecto — Tienda Online (`tienda`) 🛒
Aplica los conceptos de usuarios y permisos en el segundo proyecto (C:\proyectos\django\tienda), donde los clientes tienen límites de crédito y categorización VIP.
Reto 8.1: Extensión de Cliente con Límite de Crédito
En pedidos/models.py, amplía el modelo de Cliente con un método puede_comprar_a_credito(monto) que valide si el total del pedido no excede su crédito asignado y su cuenta no está bloqueada por fraude.
Ver Solución Explicada
Reto 8.2: Acción de Admin para Ascender a Cliente VIP
Crea una acción en el panel administrativo de la tienda que convierta a los clientes seleccionados en es_vip = True y les otorgue automáticamente un límite de crédito de $2,000 USD.
Ver Solución Explicada
Ponte a prueba
Verifica que comprendes el modelo de usuario personalizado, la configuración de UserAdmin y el control de seguridad.


