Autenticación y Autorización¶
El Sistema A3 utiliza autenticación basada en sesiones de Django y un sistema de permisos basado en grupos.
Autenticación¶
Login¶
POST /api/auth/login/
Content-Type: application/json
{
"username": "usuario",
"password": "contraseña"
}
Respuesta exitosa:
{
"user": {
"id": 1,
"username": "usuario",
"first_name": "Juan",
"last_name": "Pérez",
"email": "juan@example.com"
},
"perfil": {
"tipo_perfil": "ASESOR",
"plaza": "MONTERREY"
}
}
Logout¶
Verificar Sesión¶
Retorna información del usuario autenticado o 401 si no hay sesión.
Cookies de Sesión¶
Django crea una cookie sessionid que debe incluirse en todas las peticiones:
CSRF Protection¶
Para peticiones POST/PUT/DELETE, incluir el token CSRF:
$.ajax({
url: '/api/apartados/',
method: 'POST',
data: data,
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
});
Autorización¶
Grupos de Usuarios¶
El sistema tiene 9 grupos con diferentes permisos:
- Beta: Acceso a funcionalidades beta
- Contabilidad: Aprobación de gastos y comprobaciones
- Coordinador: Gestión de plaza asignada
- Corporativo: Acceso completo a todas las plazas
- Gerente: Supervisión de equipos
- Marketing: Acceso a prospectos y campañas
- RC (Representante Comercial): Ventas y clientes
- Sistemas: Administración del sistema
- Tesorería: Aprobación final de pagos
Permisos por Endpoint¶
| Endpoint | Beta | Contabilidad | Coordinador | Corporativo | Gerente | Marketing | RC | Sistemas | Tesorería |
|---|---|---|---|---|---|---|---|---|---|
/api/inventario/casas/ |
✓ | ✓ | ✓ (su plaza) | ✓ | ✓ | ✓ | ✓ (su plaza) | ✓ | ✓ |
/api/apartados/ (create) |
- | - | - | ✓ | - | - | ✓ | ✓ | - |
/api/comprobaciones/ (aprobar) |
- | ✓ | - | ✓ | - | - | - | ✓ | ✓ |
/api/users/ |
- | - | - | ✓ | - | - | - | ✓ | - |
Filtrado por Plaza¶
Los usuarios (excepto Corporativo y Sistemas) solo ven datos de su plaza:
def get_queryset(self):
user = self.request.user
if user.groups.filter(name__in=['Corporativo', 'Sistemas']).exists():
return Casa.objects.all()
return Casa.objects.filter(plaza=user.perfil.plaza)
Decoradores de Permisos¶
En Views¶
from django.contrib.auth.decorators import login_required, permission_required
@login_required
def mi_vista(request):
pass
@permission_required('inventario.add_casa')
def crear_casa(request):
pass
En ViewSets (DRF)¶
from rest_framework.permissions import IsAuthenticated
from rest_framework.decorators import action
class CasaViewSet(viewsets.ModelViewSet):
permission_classes = [IsAuthenticated]
def get_queryset(self):
# Filtrar por permisos
pass
@action(detail=True, methods=['post'])
def solicitar_inspeccion(self, request, pk=None):
# Solo Coordinadores y Corporativo
if not request.user.groups.filter(
name__in=['Coordinador', 'Corporativo']
).exists():
return Response(
{'error': 'No tienes permisos'},
status=403
)
pass
Custom Permissions¶
# permissions.py
from rest_framework import permissions
class EsPropietarioOCorporativo(permissions.BasePermission):
"""
El usuario debe ser el propietario o ser de Corporativo
"""
def has_object_permission(self, request, view, obj):
# Corporativo puede todo
if request.user.groups.filter(name='Corporativo').exists():
return True
# El propietario puede ver/editar
return obj.usuario_creacion == request.user
Tokens de API (Futuro)¶
Actualmente no hay soporte para tokens de API (JWT, OAuth), pero está planeado:
# Futuro
POST /api/token/
{
"username": "usuario",
"password": "contraseña"
}
# Respuesta
{
"access": "eyJ0eXAiOiJKV1...",
"refresh": "eyJ0eXAiOiJKV1..."
}
Mejores Prácticas¶
Cliente (Frontend)¶
- Guardar sessionid en cookie (automático en navegador)
- Incluir CSRF token en peticiones mutables
- Manejar 401/403 y redirigir a login
- Renovar sesión con actividad del usuario
Servidor (Backend)¶
- Validar permisos en cada endpoint
- Filtrar por plaza en queries
- Auditar acciones críticas
- Limitar intentos de login
- Usar HTTPS en producción
Seguridad¶
- HTTPS obligatorio en producción
- Passwords hasheados con PBKDF2
- Sessions en BD (no en cookies)
- CSRF tokens en formularios
- Rate limiting (recomendado implementar)
- 2FA (futuro)
Ver también: - Grupos y Permisos - Módulo Usuarios