【问题标题】:Django, How authenticate user with first name and last name?Django,如何使用名字和姓氏对用户进行身份验证?
【发布时间】:2010-04-16 01:52:32
【问题描述】:

我想使用名字和姓氏对用户进行身份验证

这是我正在使用的代码

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

它不断提出 NoneType: None

我已经检查了名字和姓氏以及密码是否正确?

我做错了什么?谢谢

【问题讨论】:

  • password=passwordz -> 密码=password ??

标签: python django django-models django-admin


【解决方案1】:

这里的困难在于,通常您会通过创建实现authenticateget_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 文档提供了很多关于自定义后端的有用细节:User auth with custom backend

在旁注中,需要注意的是其中包含空格的姓氏,例如“de la Cruz”。如果您在split 函数上为 maxsplit 指定 1,您将避免此问题。

【讨论】:

  • 啊,对不起!在我输入该代码时,有人一直在跟我说话,我忘记包括它检查以确保密码有效的部分。查看 django 文档链接以了解整个实现(您还需要检查以确保用户未设置为 is_active=False 和其他详细信息)
【解决方案2】:

从@T 构建一点。斯通的想法。为什么不让他们使用他们的名字和姓氏注册,然后将它们连接在一起并将其用作他们的用户名?每次让他们登录时,您都可以设置视图以再次组合这两个字段并使用该字符串。

您将无法使用他们可以为您生成的某些自动表单,但这没什么大不了的。我只需将两个字符串组合起来,将它们小写并将其作为用户名并为每个登录实例执行相同的操作。

【讨论】:

    【解决方案3】:

    您可以在后端认证功能中使用任何参数,即:

    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)
    

    但是,一个缺点是您需要实现自己的登录表单,并且管理界面不支持此身份验证。

    【讨论】:

      【解决方案4】:

      我喜欢不让用户记住用户名的想法,但我认为更好的解决方案是将他们的电子邮件地址作为用户名。在您的特定应用程序中假设没有两个用户的名字和姓氏相同,您是否公平?如果这不是一个公平的假设,您的系统将如何处理?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-17
        • 2019-01-10
        • 1970-01-01
        • 2014-04-13
        • 2020-10-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多