CreaRack-SL

Cierre del formulario de registro built-in de allauth

Funcionalidadactivecreado Tue Aug 04#core#security#auth#multi-tenancy#saas#allauth

Descripción

Se cierra permanentemente el formulario de registro built-in de allauth (/accounts/signup/) que respondía en producción sin haber sido diseñado explícitamente. Este es el F0 de la task #137 (registro público de tenants).

El Problema

El endpoint /accounts/signup/ servido por la librería django-allauth creaba usuarios sin organización (organization=None), lo que genera un estado roto para toda la aplicación:

  • El modelo User requiere siempre una organización (campo con null=False).
  • El gating de módulos SaaS (model SaaSModule + require_org()) falla cerrado: usuarios sin org no pueden acceder a nada.
  • Verificación en PROD (04-08-2026): 0 usuarios sin org encontrados → nadie lo llegó a usar.

La Solución

Implementada en core/adapters.py:

def is_open_for_signup(self, request):
    # El alta de tenants pasa por POST /api/signup/ (org + admin sin
    # password, activado por email). El form built-in de allauth crearia
    # usuarios con organization=None — rotos para toda la app.
    return False

El método is_open_for_signup() del adapter CreaRackAccountAdapter:

  • Retorna False para todas las solicitudes.
  • Allauth sirve la página de cierre automáticamente (signup_closed.html).
  • POST al formulario es rechazado (estado 403 o similar, según versión de allauth).

El único camino correcto de registro

El registro real de nuevas organizaciones (tenants) es POST /api/signup/:

  • Creación de organización + usuario admin simultáneos.
  • Sin password en alta (activación por email obligatoria).
  • Será acompañado de UI en fases siguientes de la #137.

Cambios en Rate Limit

Problema anterior: RATE_LIMIT_ENDPOINTS protegía rutas fantasma (/api/auth/login|register) que nunca existieron.

  • Real endpoint de login: /accounts/login/ (formulario, post-allauth).
  • Signup real: /api/signup/ (API).

Corrección:

  • /api/signup: 3 req/min (rate limit estricto).
  • /accounts/login/: 5 req/min.
  • Eliminadas las rutas fantasma /api/auth/* del config.

Impacto

✅ Para usuarios existentes: Ninguno. El login y operaciones normales no cambian. ✅ Para nuevos registros: Deben pasar por el portal de invitación (fases siguientes de #137). 🔒 Seguridad: Anti-abuso correcto en el endpoint real.

Tests

Nuevo fichero tests/api/test_signup_gate.py (5 tests):

  • test_signup_page_does_not_offer_form: GET /accounts/signup/ sirve página cerrada.
  • test_signup_post_creates_no_user: POST no crea usuarios.
  • test_api_signup_has_strict_limit: Rate limit en lugar correcto.
  • test_accounts_login_has_strict_limit: Login protegido.
  • test_phantom_routes_are_gone: Verifica que las rutas antiguas no vuelvan.

Archivo afectado

  • core/adapters.py: +9 LOC (override del adapter).
  • tests/api/test_signup_gate.py: Nuevo, 60 LOC.
  • config/settings/base.py, config/settings/production.py: Rate limit corrected.
  • core/middleware/rate_limit.py: Rutas corregidas en comentarios.

Véase también

  • [[entity—core—model—organization]]
  • [[entity—core—model—user]]
  • [[concept—saas—multi-tenancy]]
  • [[entity—core—middleware—rate-limit]]
  • [[entity—core—utility—require-org]]