Saltar a contenido

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

POST /api/auth/logout/

Verificar Sesión

GET /api/auth/user/

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:

curl -X GET https://api.example.com/api/casas/ \
  -H "Cookie: sessionid=abc123..."

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:

  1. Beta: Acceso a funcionalidades beta
  2. Contabilidad: Aprobación de gastos y comprobaciones
  3. Coordinador: Gestión de plaza asignada
  4. Corporativo: Acceso completo a todas las plazas
  5. Gerente: Supervisión de equipos
  6. Marketing: Acceso a prospectos y campañas
  7. RC (Representante Comercial): Ventas y clientes
  8. Sistemas: Administración del sistema
  9. 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)

  1. Guardar sessionid en cookie (automático en navegador)
  2. Incluir CSRF token en peticiones mutables
  3. Manejar 401/403 y redirigir a login
  4. Renovar sesión con actividad del usuario

Servidor (Backend)

  1. Validar permisos en cada endpoint
  2. Filtrar por plaza en queries
  3. Auditar acciones críticas
  4. Limitar intentos de login
  5. 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