Cierre del formulario de registro built-in de 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
Userrequiere siempre una organización (campo connull=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
Falsepara 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]]