2014-04-25 28 views
0

所以我試圖用express和passport來構建一個應用程序,但是當我嘗試做某種TDD時,我想從控制器中分離業務邏輯。如何使用護照應用程序處理分層nodejs中的授權?

所以我有這樣一個常見的場景:

  • 通過身份驗證的用戶要刪除一個項目,他發送到API的請求:

    DELETE /api/item/1

  • 的請求由控制器方法處理,該方法將提出請求的用戶傳遞給下一層(,這似乎不是一種好方法):

    exports.delete = function (req, res, next) { var itemId = req.params.id; var userId = req.user._id; itemService.delete(itemId, userId, function (err, item) { if (err) next(err); return res.json(item); }); };

  • 服務層(或任何你想將它命名,具有所有經營業務邏輯層),然後檢查,如果該項目是由用戶所有,然後刪除或以其他方式返回一個錯誤。

所以我想知道是否有任何方式從任何層獲取當前用戶而不從控制器傳遞它。

+0

你可以設置一個全局屬性,但你真的不想這樣做。 – soulcheck

回答

1

您應該確保用戶擁有的項目,甚至將它傳遞給控制器​​,在路由配置之前:

app.del('/api/item/1', ensureUserOwnsItem, itemController.delete); 

這將導致功能ensureUserOwnsItem被稱爲呼叫控制器之前。 它應該是這樣的:

function ensureUserOwnsItem(req, res, next) { 
    if (/* user owns item */) { 
     next(); 
    } else { 
     res.send(401, 'You can\'t delete an item you don\'t own'); 
    } 
} 

您將能夠重複使用的POST路線:

app.post('/api/item/1', ensureUserOwnsItem, itemController.post); 

我建議你把這個功能的AuthController或類似的東西在裏面。

+0

謝謝!看起來不錯。我也將利用這個中間件來驗證ID(有效的ObjectId)等。 – Diego

+0

不客氣,我很高興我可以幫忙=] – gfpacheco