Django: coincidencia de mayúsculas y minúsculas de un nombre de usuario de usuario de autenticación?
Django por defecto implementa el nombre de usuario como sensible a las mayúsculas y minúsculas, ahora para la autenticación, he escrito el míoAuthentication Backend
para manejar nombres de usuario que no distinguen entre mayúsculas y minúsculas durante la autenticación.
Como se muestra en :http://blog.shopfiber.com/?p=220
Ahora, el problema es:
Tengo varios puntos de vista y métodos útiles que comparausername
a algunas picaduras.
es decir
request.user.username == username_from_some_other_system_as_str
Ahora, si el nombre de usuario esyugal
entonces:
request.user.username == 'Yugal' # Returns False
Ahora, debería volverTrue
[Lo que quería lograr]
Para eso me acuerdo deC++
dias,Operator Overloading
. Pero no creo que simplemente hacer eso para Djangoauth user
Sería una buena idea, ya queauth user
está estrechamente vinculado condjango
. Además, la sobrecarga==
hará que sea insensible a mayúsculas y minúsculas para toda la clase, no solo para elusername
campo.
Entonces, ¿cómo debo hacer estousername
Insensibilidad a los casos incluso cuando se compara en todo.
Nota:
Creando unget_username
El método que devuelve un nombre de usuario en minúsculas no siempre es posible, ya que requeriría que todo el código se vuelva a factorizar para usarlo. Puede hacerlo para su código por una vez, pero no es posible si está utilizando aplicaciones de terceros de Django.
Lo séuser.username.lower() = something.lower()
es posible, pero es propenso a errores y no es la solución de escritura para algo que se usa tan a menudo en una configuración de múltiples desarrolladores.
he utilizadoSomeModel.objects.filter(username__iexact=username)
, donde sea posible. Pero eso aún deja al sistema vulnerable a un error por parte de cualquiera de los desarrolladores desconocidos.
======================================
Descubrió la solución conceptualmente, pero no pudo hacerla funcionar (Ayuda):
####### Custom CharField for username case-insensitivity #######
from django.db.models.fields import CharField
class iUnicode:
def __init__(self, value):
self.value = value
def __eq__(self, other):
if isinstance(other, str) or isinstance(other, unicode):
return self.value.lower() == other.lower()
if isinstance(other, self.__class__):
return other == self.value
def __unicode__(self):
return unicode(self.value)
def __str__(self):
return self.__unicode__()
class UsernameCharField(CharField):
def to_python(self, value): # Its not getting called
unicode_val = super(CharField, self).to_python(value)
return iUnicode(unicode_val)
if User._meta.local_fields[1].name == 'username':
User._meta.local_fields[1] = UsernameCharField(max_length=30)
User._meta.local_fields[1].model = User
################################################################
Asumoto_python
se utiliza para convertir el valor recibido de la base de datos aunicode
en pitón. Pero, supongo que mito_python
no está siendo llamado.
Esto también asegurará la insensibilidad a las mayúsculas y minúsculas en aplicaciones de terceros y no requerirá ninguna re-factorización. Parcheará elUser
en su centro. Voy a agregar esto a__init__.py
de mi primeraINSTALLED_APP
Qué estoy haciendo mal ?