Django)使用外部模型检索的用户模型进行“验证” [英] Django ) 'authenticate' with the user model retrieved by the foreign model

查看:272
本文介绍了Django)使用外部模型检索的用户模型进行“验证”的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发电子邮件验证模块。



首先,我有一个名为SNUser的模型,具有一对一关系与默认'user'模型如下:

  class SNUser(models.Model):
#Manager
objects = SNUserManager()

#Auth
user = models.OneToOneField(User,unique = True,primary_key = True)

我完成发送包含用户唯一令牌的邮件。



当链接被点击时,我搜索到正确的SNUser对象由令牌(该标记是SNUser模型的一个领域)。



所以我想要开发的是当该令牌链接被点击时,正确的用户可以使用该服务而不登录。



所以当点击该链接时,应该完成登录(请求,用户)。



我已经尝试了两种解决方法。


  1. 当我从SNU中检索到用户模型er模型,并直接登录(请求,用户):


    snuser = SNUser.objects.get(token = key) p>

    user = snuser.user



    登录(请求,用户)
    导致错误:匿名用户。


  2. 从SNUser模型检索默认用户后,我做了authenticate(username = user.username,password = user.password )。
    但是很多人已经注意到,user.password是不是rawone的哈希。所以它再次失败。

我的目标是从我发送的链接中包含的令牌中检索用户,并让他/她使用这个服务没有登录模块,许多服务都遵循这个过程。



有没有办法解决这个问题?



谢谢!



****更新****



我创建了自定义后端不需要我的下面的原始密码:

  class SNUserEmailVerificationAuthBackend(ModelBackend):

def authenticate(self,username = None,email = None):
try:
return User.objects.get(username = username,email = email)
除了User.DoesNotExist:
return无

def get_user(self,username):
try:
return User.objects.get(username = username)
除了User.DoesNotExist :
return无

views.py中更新的关键代码如下:

  snuser.is_email_verified = True 
snuser.save()
user = snuser.user
manager = SNUserEmailVerificationAuthBackend()
new_user = manager.authenticate(username = user.username,email = user.email)
login(request,new_user)




登录(request,new_user)



上面的行正在工作(这意味着用户在登录时遇到)但同时提高错误:'用户'对象没有属性'后端'

****删除重复标记****

解决方案

使用'user.backend = None'解决。



我指向使用django中的身份验证功能哈希密码不是原始的密码



我希望它是hel pful对于任何人来说这篇文章。


I'm developing 'email verification' module.

First of all, I have a model named 'SNUser' having 'One To One' relationship with the default 'user' model below :

class SNUser(models.Model):
# Manager
    objects = SNUserManager()

# Auth
    user = models.OneToOneField(User, unique=True, primary_key=True)

I finished sending email containing the unique token for an user.

When the link is clicked, I searched the correct SNUser object by the token.(That token is one of the field of SNUser model).

So what I want to develop is that when that token link is clicked, the correct user could use the service without login.

So when that link is clicked, 'login(request,user)' should be done.

I already tried two ways to solve this.

  1. when I retrieved the user model from SNUser model and did 'login(request, user)' directly :

    snuser = SNUser.objects.get(token=key)

    user = snuser.user

    login(request, user) It results with the error : Anonymous User.

  2. After retrieving the default user from SNUser model, I did 'authenticate(username=user.username, password=user.password)'. But many of you already notice, user.password is the hashed not the rawone. So it fails again.

My goal is to retrieve the user from the token included in the link I sent and make him/her use the service without login module as many services follow this process.

Is there anyway to solve this one?

Thank you!

**** UPDATE ****

I created the custom backend not requiring raw password for my situation below :

class SNUserEmailVerificationAuthBackend(ModelBackend):

def authenticate(self, username=None, email=None):
    try:
        return User.objects.get(username=username, email=email)
    except User.DoesNotExist:
        return None

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

The updated critical code in views.py is below :

            snuser.is_email_verified = True
            snuser.save()
            user = snuser.user
            manager=SNUserEmailVerificationAuthBackend()
            new_user=manager.authenticate(username=user.username,email=user.email)
            login(request,new_user)

login(request,new_user)

Above line is working(it means user suceeds in loggin in) but raising the error simultaneously : 'User' object has no attribute 'backend'

****REMOVE DUPLICATED MARK****

解决方案

It was solved with 'user.backend=None'.

I refered to authenticate function in django using hashed password not the raw one

I wish it would be helpful for anyone refering this post.

这篇关于Django)使用外部模型检索的用户模型进行“验证”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆