【问题标题】:Django: authenticate the userDjango:验证用户
【发布时间】:2016-10-19 16:11:55
【问题描述】:

我有以下代码:

#创建用户:

def create_user(request):
    if request.method == 'POST':
        user_info = forms.UserInfoForm(request.POST)
        if user_info.is_valid():
            cleaned_info = user_info.cleaned_data
            User.objects.create_user(username=cleaned_info['username'], password=cleaned_info['password'])
   render(.......)

这行得通。我可以检查 auth_user 并看到用户名和密码以及创建和添加的所有其他字段。

现在,在使用上面的代码创建具有 username='testcase' 和 password='test': 的用户后,我尝试使用以下代码验证用户。

# 验证用户

def get_entry(request):
    if request.method == 'POST':
        user = authenticate(username='testcase', password='test')
        if user:
            .........

用户始终返回为无。到底是怎么回事?我正在运行 django 1.10.2。

更新:

当我登录管理员时,我可以看到由 create_user 函数创建的用户。状态不是员工(因为它应该是)。我将其更改为人员以查看是否导致问题,但 get_entry 方法仍然没有为用户产生任何结果。 这令人沮丧。我真的不知道我做错了什么。

【问题讨论】:

  • 我没有。我认为 create_user() 方法会在后台处理该问题。而且因为我可以看到在 auth_users 中创建的用户,所以它被保存了。我不知道 .save() 方法在后台是否还有什么作用。
  • 尝试插入存储在 auth_user 表的密码属性中的散列密码,而不是测试。
  • authenticate 在进行任何比较之前自动对密码进行哈希处理。我认为不需要散列。
  • 尝试使用另一种方式创建的用户测试get_entry 方法,并尝试使用使用create_user 方法创建的用户登录其他地方(例如 Django 管理员)(您必须设置is_staff=True)。这样您就可以确定哪些视图不起作用。
  • 您使用的是默认用户模型吗?您能否确认您已将AUTHENTICATION_BACKENDS 设置为django.contrib.auth.backends.ModelBackend。这是默认设置的,但可以确保。 from django.conf import settings 然后print(settings.AUTHENTICATION_BACKENDS) docs ........

标签: python django


【解决方案1】:

将用户保存在一个var中,然后调用user.save(),因为用户不能调用save()方法试试:

def create_user(request):
        if request.method == 'POST':
            user_info = forms.UserInfoForm(request.POST)
            if user_info.is_valid():
                cleaned_info = user_info.cleaned_data
                user = User.objects.create_user(username=cleaned_info['username'], password=cleaned_info['password'])
                user.save()
       render(.......)

然后你需要在你的函数get_entry中调用auth.authenticate:

def get_entry(request):
    if request.method == 'POST':
        user = auth.authenticate(username='testcase', password='test')
        if user:
            .........

【讨论】:

【解决方案2】:

您的代码似乎是正确的。

问题可能在于参数被传递到create_user 视图的方式(参数在get_entry 视图中传递极不可能成为问题,因为参数usernamepassword 是硬编码的) .

在将usernamepassword 传递给User.objects.create_user() 之前尝试打印出它们,因为password 字段可能未正确保存和/或正在传递空password,而Django 可能为空密码创建哈希。

P.S.:这只是一个猜测,需要您对此做出回应以进一步诊断问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-01
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2019-06-05
    • 2012-05-05
    • 2014-05-04
    相关资源
    最近更新 更多