20

我有以下代码片段:

user = User(username='h@h.com',email='h@h.com')
user.set_password('pass')
user.save()
u = authenticate(username='h@h.com', password='pass') #this always returns None!!!

问题是,你总是无。我已经关注了其他堆栈溢出帖子上的代码示例,并将其范围缩小到上述几行。

关于可能发生什么的任何想法?

4

7 回答 7

11

在你的设置中加入这样的东西

#Authentication backends
AUTHENTICATION_BACKENDS = (
        'django.contrib.auth.backends.ModelBackend',
    )

或者如果您将 userena 用于您的帐户

#Authentication backends
AUTHENTICATION_BACKENDS = (
    'userena.backends.UserenaAuthenticationBackend',
    'guardian.backends.ObjectPermissionBackend',
    'django.contrib.auth.backends.ModelBackend',
)
于 2013-11-05T13:26:03.063 回答
6

有趣的是,check_password 在下面返回 True:

eml = "4@a.com"
pw = "pass"
uname = 'w2'
user = User.objects.create_user(uname,eml,pw)
user.save()
log.debug("Password check passes?")
log.debug(user.check_password(pw)) # Logs True!!!
user = authenticate(username=uname, password=pw)
于 2013-09-06T18:30:42.283 回答
3

为什么不创建这样的用户:

user = User.objects.create_user( username="whatever", email="whatever@some.com", password="password")
user = authenticate( username="whatever",password="password")
于 2013-09-06T17:21:53.590 回答
2

在 settings.py 中,添加

AUTH_USER_MODEL = your custom user class

例如,如果 django 应用程序名称是 office 并且自定义用户类是 Account 那么

AUTH_USER_MODEL = 'office.Account'
于 2015-12-09T01:44:38.813 回答
1

set_password是一种误导性的方法,它不会将密码保存在用户表上。你需要打电话user.save()才能让它在你的流程上工作

于 2019-02-11T18:20:27.163 回答
0

还要检查您是否拥有正确的用户名/密码组合。有时,从 createsuperuser 命令创建的用户名与您通常使用的用户名不同。

于 2018-10-08T03:27:32.763 回答
0

正如他们中的大多数人所建议的那样,如果我们使用User.objects.create_user(**validated_data)它来创建用户,它将散列原始密码并存储散列密码。如果您使用 User 模型serializers来验证和创建用户,则需要像这样覆盖序列化器方法

class UserSerializers(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = "__all__"

    # this is the method responsible for insertion of data with hashed password
    def create(self, validated_data):
        return User.objects.create_user(**validated_data)
于 2021-12-20T12:54:19.697 回答