Asegura tus endpoints en Django Rest Framework con un flujo claro de autenticación, autorización y permission classes. Con SessionAuthentication, inicio de sesión vía API auth y permisos como IsAuthenticated, IsAuthenticatedOrReadOnly y un permiso personalizado IsDoctor, puedes controlar quién entra y qué puede hacer en tu API.
¿Qué significan autenticación y autorización en APIs?
La autenticación verifica quién eres: como mostrar tu documento al llegar a un hotel. En sistemas, suele ser usuario y contraseña. La autorización define qué puedes hacer: la llave del hotel abre solo tu habitación, no todas. En APIs, es el conjunto de permisos que habilitan acciones específicas.
- Autenticación: demostrar identidad con credenciales.
- Autorización: limitar acciones según permisos.
- Metáfora del hotel aplicada a endpoints.
¿Cómo configurar Django Rest Framework con session authentication?
Django Rest Framework reutiliza el sistema de Django. Con SessionAuthentication, tras autenticarse, Django agrega una cookie que viaja en cada request para identificarte. Así, puedes usar el mismo login que en Django admin.
- Configura DEFAULT_AUTHENTICATION_CLASSES con SessionAuthentication.
- Agrega la URL de API auth e incluye las rutas del sistema de DRF.
- Recarga la interfaz de DRF: aparece el link Login.
- Crea un superusuario con manage.py create super user.
- Inicia sesión y verás tu usuario y el Logout en la esquina superior derecha.
# settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'SessionAuthentication',
],
}
# urls.py (agregar la ruta de autenticación de DRF)
urlpatterns = [
# ...
path('api-auth/', include('rest_framework.urls')),
]
# crear superusuario
python manage.py create super user
¿Cómo aplicar permisos y proteger endpoints con Django Rest?
Con permission classes puedes exigir autenticación, permitir solo lectura a anónimos o crear reglas a la medida. La interfaz de DRF reacciona a estos permisos: si no puedes escribir, oculta formularios.
¿Qué permission classes usar para acceso seguro?
Al definir en tu view set algo como permission_classes, puedes activar IsAuthenticated para que todo el view set funcione solo si hay sesión iniciada.
- Si no hay sesión, devuelve un detalle en JSON: “La autenticación no está proveída”.
- La respuesta es un 401 al estar deslogueado.
- Al loguearte, los endpoints vuelven a responder.
# ejemplo en un ViewSet
class DoctorViewSet(ModelViewSet):
permission_classes = [IsAuthenticated]
¿Cómo permitir lectura pública con IsAuthenticatedOrReadOnly?
Cuando necesitas listar recursos públicamente pero evitar modificaciones a usuarios anónimos, usa IsAuthenticatedOrReadOnly.
- Usuarios anónimos ven la lista.
- La UI de DRF oculta el formulario de edición.
- Usuarios autenticados mantienen las acciones de escritura.
class DoctorViewSet(ModelViewSet):
permission_classes = [IsAuthenticatedOrReadOnly]
¿Cómo crear un permiso personalizado IsDoctor con grupos?
Para reglas de negocio más finas, crea un permiso a medida. Ejemplo: solo usuarios del grupo Doctors pueden modificar doctores.
Pasos clave:
- En Django admin, crea el grupo Doctors y asígnalo al usuario admin.
- Crea permissions.py con un permiso IsDoctor.
- Hereda de PermissionsBasedPermission y sobrescribe hasPermission.
- Valida el grupo con request.user.groups.filter(name='Doctors').exists().
- Combina en el view set: primero autenticación y luego IsDoctor.
# permissions.py
from rest_framework import permissions
class IsDoctor(permissions.PermissionsBasedPermission):
def hasPermission(self, request, view):
return request.user.groups.filter(name='Doctors').exists()
# uso en el ViewSet: primero autenticado, luego regla de doctor
class DoctorViewSet(ModelViewSet):
permission_classes = [IsAuthenticated, IsDoctor]
Pruebas prácticas:
- Usuario con grupo Doctors edita un doctor con éxito.
- Usuario sin grupo recibe 403 Prohibido: “No tienes permisos para hacer esta acción”.
- Diferencia clara entre 401 (no autenticado) y 403 (autenticado sin permiso).
¿Quieres que revisemos tu configuración de permisos o un caso de negocio específico? Cuéntame en los comentarios qué reglas necesitas implementar.