2016-10-03 47 views
3

我已經擴展了撇號快速模塊實現邏輯來檢查請求標頭中的Cookie。此檢查中的一種情況是自動登錄用戶。如果cookie key/val與預設的標誌值相匹配,那麼我想在aposUsersSafe集合中進行查找(基於電子郵件地址),並且如果用戶存在於集合中,則會自動將其簽入cms 。自動登錄用戶以撇號

目前,我已通過運行基於電子郵件的用戶蒙戈查詢實現用戶查找:

變種集合= db.collection(「aposUsersSafe」);

collection.find({email: email}).toArray(function (err, result) { 
     if (err) { 
     deferred.reject(new Error(error)); 
     } else if (result.length) { 
     deferred.resolve(result); 
     } else { 
     console.log('User not found'); 
     } 

但我看到撇號登錄模塊通過護照提供身份驗證和權限的方法。延伸撇號登錄和護照是實現這種自動登錄解決方案的方式嗎?謝謝!

回答

3

正如我在回答你先前的問題時所提到的,我是P'unk Avenue的首席建築師撇號。

實際上有我們的演示項目完全實現自動登錄的,成熟的借款(:我們希望自動登錄的用戶,使人們甚至不會看到用戶界面之前放棄

。這是很短的,所以在這裏它是:

module.exports = { 
    construct: function(self, options) { 
    self.pageBeforeSend = function(req, callback) { 
     if (!req.cookies.demo_autologin) { 
     return self.apos.users.find(req, { username: 'admin' }).permission(false).toObject(function(err, user) { 
      if (err) { 
      return callback(err); 
      } 
      if (!user) { 
      return callback(null); 
      } 
      req.login(user, function(err) { 
      if (err) { 
       return callback(err); 
      } 
      // Start a whole new request, but logged in. After this they 
      // have the cookie so they can log out and back in normally if they want 
      req.res.cookie('demo_autologin', 1); 
      return req.res.redirect('/'); 
      }); 
     }); 
     } 
     return callback(null); 
    }; 
    } 
}; 

當然,你需要通過將其包括在modules財產,其餘以啓用app.jsdemo-autologin模塊

下面是這個模塊是如何工作的:

  1. 它提供了一個pageBeforeSend方法,只是前一個頁面發送到瀏覽器都會調用。

  2. 它檢查是否已設置demo_autologin cookie。

  3. 如果不是,它通過由apostrophe-users模塊的find方法提供了一種光標找到admin用戶,使用permission(false)繞過權限檢查,通常會限制什麼都可以找到。

  4. 它調用req.login,這是一個由passport提供的方法,它使得以編程方式記錄用戶非常容易。

  5. 它通過req.res.cookie設置cookie。總是可以從req訪問res對象,反之亦然。在撇號中,通常只會傳遞req,因爲req.res可用,因爲在大多數情況下,您將向req添加更多數據,而不是直接響應。

  6. 它重定向到主頁,以便整個頁面加載爲登錄體驗。

你自然會決定去尋找根據不同於標準哪個用戶「只是讓大家管理員」,但它聽起來像是你有一部分手柄和該代碼應該很容易適應您的需求。如果用戶拒絕接受一個普通的舊會話cookie,那麼這個代碼可能會遇到一個重定向循環,但是如果你想要,常規登錄不會工作,但如果你願意,你可以跟蹤情況通過查詢字符串,並告訴用戶啓用cookie,如果他們在這裏兩次。)

此答案已更正,包括req參數find