Django: изменение / разрешение имена пользователя вхождения пользователя, чтобы также использовать его / ее электронную почту

StackOverflow https://stackoverflow.com/questions/4267627

Вопрос

Как говорит мой титул, я хочу знать, есть ли я способ разрешить пользователю использовать не только свое имя пользователя, но и по электронной почте его пользователя для входа в систему. Я хочу стандартизировать процедуру входа в систему, потому что в данный момент у меня есть мои пользователи, используя много разных конвенций, и она становится довольно грязным.

Это было полезно?

Решение

Вы, вероятно, можете сделать это, если вы используете уникальные адреса электронной почты. Это означает, что пользователь не может иметь тот же адрес электронной почты. Таким образом, вы можете получить пользователь по электронной почте и входить в систему.

Форма может выглядеть что-то подобное:

<form method="post" action="{% url myproject.views.login %}">
     <p>Username</p>
     <input type='text' name='username'/>

     <p>Password</p>
     <input type='password' name='password'/>
     <input type="submit" value="Login"/>
</form>

Метод просмотра может выглядеть что-то подобное:

def login( request ):
    username = request.POST['username']
    password = request.POST['password']
    user = User.objects.filter( email = username )[0]
    if( user is not None ):
         # -- the user was retrieved by an email address
         # -- now you can authenticate and log them in log them in
         from django.contrib import auth
         user = auth.authenticate( user.username, password )
         if( user is not None ):
              auth.login( user, request )

OpenID может быть еще один способ пойти: http://bit.ly/a2olhx.

Убедитесь, что уникальные адреса электронной почты на пользователя: http://bit.ly/aoaabw.

Другие советы

Я думаю, что я решаю мою проблему, по крайней мере, это функционально, пока. Я решил использовать свою собственную бэкэнд аутентификации. Я создал файл 'auth_backends.py' и добавил его к аутентификации_backends в моих настройках .py:

Мои поля входа в систему содержит только «имя пользователя» и пароль. Единственный способ, которым я делаю, чтобы проверить, является ли введенное имя пользователя на самом деле его имя пользователя или адрес электронной почты, выполняя .find ('@'). Есть ли лучший способ проверить на наличие? Это будет достаточно? Весь причина, по которой я делаю это, это потому, что пользователю проще вспомнить его / ее электронное письмо, чем его имя пользователя (на самом деле «ID», состоящий из чисел).

Я также должен позаботиться о дублированных электронных письмах.

from django.conf import settings
from django.contrib.auth.backends import ModelBackend
from django.core.exceptions import ImproperlyConfigured
from django.db.models import get_model
from django.contrib.auth.models import User

class CustomUserModelBackend(ModelBackend):

def authenticate(self, **credentials):
    if 'username' in credentials:
        if credentials['username'].find('@') > 0:
            return self.authenticate_by_email(**credentials)
        else:
            return self.authenticate_by_username(**credentials)

def authenticate_by_username(self, username=None, password=None):
    try:
        user = User.objects.get(username=username)
        if user.check_password(password):
            return user
    except User.DoesNotExist:
        return None

def authenticate_by_email(self, username=None, password=None):
    try:
        user = User.objects.get(email=username)
        if user.check_password(password):
            return user
    except User.DoesNotExist:
        return None
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top