Django, как аутентифицировать пользователя по имени и фамилии? - PullRequest
1 голос
/ 16 апреля 2010

я хочу аутентифицировать пользователей, используя имя и фамилию

Это код, который я использую

user = auth.authenticate (first_name = firstname, last_name = фамилия, пароль = пароль)

он продолжает придумывать NoneType: None

Я проверил правильность имени и фамилии плюс пароль?

что я делаю не так? спасибо

Ответы [ 4 ]

3 голосов
/ 16 апреля 2010

Сложность в том, что обычно вы справляетесь с этим, создавая пользовательский бэкэнд аутентификации, который реализует authenticate и get_user. Однако подпись функции для authenticate:

def authenticate(self, username=None, password=None):

Везде в Django, который будет вызывать это, будет передаваться только 2 параметра, имя пользователя и пароль. Это означает, что использование любой из общих форм аутентификации и таких вещей, как интерфейс администратора, будет нарушено, если это будет сделано любым другим способом.

Единственный обходной путь, который я мог видеть, и это отчасти схематично, это если имя пользователя должно быть напечатано как одна запись со строкой «First Last» (разделенной пробелом) вместо имени пользователя. Затем вы можете выделить его и использовать это значение ...

(это все не проверено, но вы поняли)

class FirstLastNameBackend(object):
    def authenticate(self, username=None, password=None):
        first, last = username.split(' ', 1)
        try:
            user = User.objects.get(first_name=first, last_name=last)
            if user:
                # Check if the password is correct
                # check if the user is active
                # etc., etc.
                return user
        except:
            pass
        return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except:
            return None

В django doc содержится много полезной информации о создании пользовательского бэкэнда: Авторизация пользователя с пользовательским бэкэндом

В примечании, к которому следует позаботиться, относятся фамилии, в которых есть пробел (ы), например "de la Cruz". Если вы укажете 1 для maxsplit в функции split, вы избежите этой проблемы.

2 голосов
/ 16 апреля 2010

Вы можете использовать любые параметры в функции аутентификации бэкэнда, т. Е .:

class FirstLastNameBackend(object):
  def authenticate(self, first_name=None, last_name=None, password=None):
    pass #your user auth code goes here

Для аутентификации пользователя звоните

user = auth.authenticate(first_name=firstname,
    last_name=lastname,
    password=password)

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

2 голосов
/ 16 апреля 2010

Строим немного из @T. Идея Стоуна. Почему бы не сделать так, чтобы они зарегистрировались под своим именем и фамилией, и вы просто объединяете их вместе и используете это как свое имя пользователя ?. И каждый раз, когда вы входите в систему, вы настраиваете представление, чтобы снова объединить два поля и использовать эту строку.

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

1 голос
/ 17 апреля 2010

Мне нравится идея не заставлять пользователей запоминать имя пользователя, но я думаю, что лучшим решением для этого было бы, чтобы их адрес электронной почты был их именем пользователя. Справедливо ли для вас предположить, что в вашем конкретном приложении нет двух пользователей с одинаковыми именами и фамилиями? Если это неверное предположение, как ваша система справится с этим?

...