Proteger las vistas y garantizar que cada usuario vea únicamente su propia información es una práctica fundamental en cualquier aplicación web. Aquí se aborda un bug común en Django: mostrar todas las órdenes activas sin distinguir a qué usuario pertenecen, y se corrige con dos ajustes sencillos pero esenciales.
¿Cómo filtrar las órdenes para que cada usuario vea solo las suyas?
El problema parte de la query dentro del archivo My Order View [01:07]. La consulta original obtiene de todas las órdenes la que esté activa y trae solo la primera, pero no filtra por usuario. Esto significa que cualquier persona autenticada podría ver órdenes que no le corresponden.
Al revisar el modelo, se confirma que existe una relación con el modelo de usuario [01:22]. Gracias a esa relación, basta con agregar un filtro que vincule la orden con el usuario de la petición actual:
python
users=self.request.user
Con esta línea, la query ahora trae únicamente las órdenes activas del usuario autenticado [01:30]. Es un cambio mínimo con un impacto enorme en la seguridad de los datos.
¿Qué sucede si un usuario no autenticado intenta acceder?
Al utilizar request.user sin validar la autenticación, un visitante anónimo que intente acceder a la página de pedidos recibirá un error [01:42]. Esto se comprueba fácilmente cerrando sesión y tratando de entrar a la ruta de "pedidos mi orden" [01:52].
Para resolverlo se emplea un mixin llamado LoginRequiredMixin [02:08]. Este componente se importa desde django.contrib.auth.mixins:
python
from django.contrib.auth.mixins import LoginRequiredMixin
Después se incorpora como primera clase padre en la vista, antes de DetailView [02:20]. El orden importa: al colocarlo primero, Django valida si el usuario está logueado antes de ejecutar cualquier otra lógica.
python
class MyOrderView(LoginRequiredMixin, DetailView):
...
¿Cómo configurar la URL de redirección al login?
Además del mixin, es necesario indicar en el archivo settings.py del proyecto una nueva variable [02:30]:
python
LOGIN_URL = 'login'
El valor corresponde al nombre de la URL de login definida en el archivo de URLs de usuarios [02:38]. Con esto, cuando alguien no autenticado intente acceder a una vista protegida, será redirigido automáticamente a la página de inicio de sesión.
Un detalle interesante es que Django agrega un parámetro next en la URL de redirección [02:55]. Este parámetro indica a qué página debe dirigirse el usuario después de autenticarse correctamente, mejorando la experiencia sin perder el contexto de la acción original.
¿Cómo verificar que el bug quedó resuelto?
Tras aplicar ambos cambios, al recargar la página sin sesión activa, el sistema redirige al formulario de login [02:50]. Una vez autenticado, el usuario accede directamente a los detalles de sus órdenes y puede confirmar que solo visualiza las que él mismo ha solicitado [03:03].
¿Por qué es importante practicar con pull requests y code review?
Corregir este tipo de bugs es una oportunidad perfecta para escribir un pull request y compartirlo con la comunidad [03:12]. La práctica de code review permite recibir retroalimentación, detectar otros posibles problemas y mejorar la calidad del código de forma colaborativa. Si ya aplicaste la corrección, comparte tu PR en el sistema de comentarios y revisa el trabajo de otros compañeros.