2015-12-13 107 views
1

後,我試圖阻止用戶登錄後3次失敗時,他們提供正確的用戶名或電子郵件地址和錯誤的密碼嘗試。流星,跟蹤用戶的登錄嘗試失敗,並禁止他們登錄X試圖

Accounts.validateLoginAttempt(function(info){ 
    var user = info.user; 
    var failAttemp = user.profile.loginFaileAttempt; 
    if(failAttemp == 3){ 
     console.log('you need to contact the admin!') 
     return false; 
    }else{ 

     if(Meteor.Error == 'Incorrect password '){ 
      // incremnt the fail attempts 
      failAttemp++; 
      console.log(failAttemp); 
     } 
    } 

    return true; 
    // success login set to 0 
    failAttemp = 0; 

}); 

但它不工作,我做錯了什麼,是否有任何流星的方式做到這一點?

謝謝。

+0

你是不是保存失敗的嘗試,至少在這裏的代碼。因此,user.profile.loginFaileAttempt將始終保持爲0.最後一行failAttemp = 0;將永遠不會執行,雖然不是這裏的問題。 –

回答

3

失敗的嘗試計數未在代碼中的用戶集合中更新。最後一行failAttemp = 0;將永遠不會執行,因爲函數已經返回。

此外,我看到一些您可能想要解決的問題: Meteor.Error不是檢查輸入的不正確密碼的正確方法。這將是未定義的,甚至更多,它不會觸發,因爲'密碼不正確'的額外空間。 使用參數info附帶的error對象,並使用錯誤代碼而不是消息。

來自未註冊用戶的登錄嘗試獲取傳遞到Accounts.validateLoginAttempt反正。在這種嘗試中,info.user將爲空。除此之外,最好檢查是否存在profile字段是用戶對象。

當用戶已經3次失敗嘗試,並試圖爲第四次,他並不瞭解什麼是錯的。他仍然看到「密碼不正確」,並在服務器的控制檯上顯示「您需要聯繫管理員!」。 你可以拋出Meteor.Error與更多的信息。

當用戶有3次失敗的嘗試,他將留在「禁用」狀態。我的意思是,即使他記得他的正確密碼,他也不能再登錄。首先檢查嘗試是否被禁止,然後檢查嘗試失敗的次數。

當用戶進入一個失敗的嘗試後,正確的密碼,嘗試失敗計數應該回歸到0,至少這是我想你會想看着你的代碼(最後可達代碼行)。

這裏是將一個解決方案的示例:

  • 保存失敗的嘗試。
  • 根據錯誤代碼而不是消息執行檢查。
  • 3次失敗嘗試後有信息。
  • 正確處理未註冊的用戶。
  • 允許用戶在嘗試失敗後登錄,如果他們記住他們的密碼。
  • 成功登錄後重置失敗的嘗試次數。

代碼:

Accounts.validateLoginAttempt(function(info){ 
    var user = info.user; 
    if (!user) 
     return false; 

    var failAttempt = 0; 
    if (user.profile) 
     failAttempt = user.profile.loginFaileAttempt; 

    var loginAllowed = false; 
    if(info.error && info.error.error == 403){ 
     if(failAttempt >= 3) { 
      console.log('you need to contact the admin!'); 
      throw new Meteor.Error(403, 'you need to contact the admin!'); 
     } 
     // increment the fail attempts 
     failAttempt++; 
     console.log(failAttempt); 
     loginAllowed = false; 
    } else { 
     // success login set to 0 
     failAttempt = 0; 
     loginAllowed = true; 
    } 

    Meteor.users.update({_id: user._id}, {$set: {'profile.loginFaileAttempt': failAttempt}}); 

    return loginAllowed; 
});