Django: Изменение / разрешение имени пользователя для входа в систему также использовать его / ее электронную почту - PullRequest
2 голосов
/ 24 ноября 2010

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

Ответы [ 2 ]

2 голосов
/ 24 ноября 2010

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

Форма может выглядеть примерно так:

<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

0 голосов
/ 24 ноября 2010

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

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

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...