2016-07-27 43 views
0

我正在開發'電子郵件驗證'模塊。Django)通過外部模型檢索到的用戶模型'驗證'

首先,我有一個名爲「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(標記=鍵)

    用戶= 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) 
    except User.DoesNotExist: 
     return None 

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

在視圖中更新的關鍵代碼。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)

以上線在工作(這意味着在洛用戶suceeds),但同時提高錯誤:「用戶」對象沒有屬性'後端」

****刪除重複MARK ****

+0

你是如何導入'login'的?你從哪裏得到錯誤?請顯示完整的回溯。 – Alasdair

+0

我用django內置庫'從django.contrib.auth進口驗證,登錄' – LKM

+0

@Alasdair我更新了 – LKM

回答