Login en Django con nombre de usuario sin importar mayúsculas y minúsculas (case-insensitive username login)

En algunos casos, como puede ser usuarios poco concienciados con la diferencia entre mayúsculas y minúsculas, vale la pena perder esta diferenciación en pro de una mejor usabilidad. ¿O no se le han quejado nunca de que «mi usuario no puede entrar» y simplemente es porque estaba introduciéndolo en mayúsculas o bien escribiendo desde el móvil donde le insertaba la primera letra en mayúscula?

Para realizar la modificación definiremos un backend donde devolveremos el usuario realizando una búsqueda sin tener en cuenta las mayúsculas, siempre que la contraseña sea correcta. En caso contrario devolveremos None.

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User

class CaseInsensitiveModelBackend(ModelBackend):
  def authenticate(self, username=None, password=None):
    try:
      user = User.objects.get(username__iexact=username)
      if user.check_password(password):
        return user
      return None
    except User.DoesNotExist:
      return None

Y en el settings.py deberemos especificar que haga uso de este backend con la variable AUTHENTICATION_BACKENDS:

AUTHENTICATION_BACKENDS = ('miproyecto.miapp.backends.CaseInsensitiveModelBackend',)

Y nada más, solo reiniciar el servicio para que refresque los cambios y, sobretodo, previamente asegurarse de que no existen dos usuarios con el mismo nombre pero distintos por las mayúsculas.

Vía blog.shopfiber.com.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.