Django)'认证'使用外部模型

时间:2016-07-27 18:11:10

标签: django django-authentication one-to-one django-users

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

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

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

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

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

单击链接时,我通过令牌搜索了正确的SNUser对象。(该令牌是SNUser模型的字段之一)。

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

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

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

  1. 当我从SNUser模型中检索用户模型并且登录(请求,用户)'直接:

      

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

         

    user = snuser.user

         

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

  2. 从SNUser模型中检索默认用户后,我进行了身份验证(username = user.username,password = user.password)'。 但是很多人已经注意到,user.password是哈希而不是rawone。所以它又失败了。
  3. 我的目标是从我发送的链接中包含的令牌中检索用户,并使他/她使用不带登录模块的服务,因为许多服务都遵循此过程。

    无论如何要解决这个问题?

    谢谢!

    ****更新****

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

    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
    

    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)
    
      

    登录(请求,new_user)

         

    以上行正在运行(这意味着用户已登入登录)但同时出现错误:'用户' object没有属性' backend'

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

1 个答案:

答案 0 :(得分:0)

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

我指的是authenticate function in django using hashed password not the raw one

我希望任何推荐这篇文章的人都会有所帮助。