Django认证返回无

zyfwsgd6  于 2022-11-18  发布在  Go
关注(0)|答案(9)|浏览(133)

下面的代码是:

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!!!

问题是,u总是None。我已经跟踪了其他堆栈溢出帖子的代码示例,并将其缩小到上面的行。
你知道会发生什么吗?

6za6bjd0

6za6bjd01#

在设置中添加类似的内容

#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',
)
luaexgnf

luaexgnf2#

有趣的是,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)
svdrlsy4

svdrlsy43#

为什么不像这样创建一个用户:

user = User.objects.create_user( username="whatever", email="whatever@some.com", password="password")
user = authenticate( username="whatever",password="password")
uujelgoq

uujelgoq4#

在www.example.comsettings.py中添加

AUTH_USER_MODEL = your custom user class

例如,如果django应用程序名称是office,自定义用户类是Account,则

AUTH_USER_MODEL = 'office.Account'
ui7jx7zq

ui7jx7zq5#

set_password是一个误导性的方法,它不会将密码保存在用户表中。

lzfw57am

lzfw57am6#

您必须检查用户是否处于活动状态?如果不是,您只需在管理面板中将用户设置为活动状态,或者在创建用户时通过向用户模型添加以下行来设置:

is_active = models.BooleanField(default=True)
pgvzfuti

pgvzfuti7#

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

9w11ddsr

9w11ddsr8#

正如大多数人所建议的,如果我们使用User.objects.create_user(**validated_data)创建用户的,这将对原始密码进行散列,并存储散列后的密码。

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)
2fjabf4q

2fjabf4q9#

我对这个问题困惑了四天,上面的答案也没有帮助。问题是,我,像你一样,正在使用user.save(),我不能看到问题是什么,但后来我用调试的眼睛看了看,结果发现,如果你使用user.save(),它会以某种方式扰乱密码的哈希。别问我怎么会不知道。所以我用Django提供的user.create()方法解决了这个问题,效果非常好:

@api_view(['POST'])
def create_user(request):
    new_user = UserSerializer(data=request.data)
    if new_user.is_valid():
        user_saved = new_user.create(request.data)
        return Response('User {} created'.format(user_saved.username), 
                                           status=status.HTTP_200_OK)
    else:
        return Response('User not created', status=status.HTTP_200_OK)

我使用了类似的代码,但是您可以使用user.create()来完成您希望的操作。

相关问题