2016-01-19 50 views
1

我正在用兩種類型的用戶構建一個API;管理員和客人。我創建了一箇中間件用來檢查是否允許用戶訪問某些API終點,我把它像這樣:檢查用戶是否只更改他的數據

app.all('/api/*', [require('./validateReq')]); 

我所有的路線是這樣的:

/api/* 
/api/admin/* 

validateReq檢查令牌通過並且是有效的。如果有效,通常會處理請求。

我的用戶模型具有布爾值admin,它與標記結合驗證其他/api/admin路由。

我現在的問題是如何確保用戶只修改他的數據。一個例子是如果他正在更新他的個人資料。什麼可以防止其他用戶修改其他用戶的個人資料?我的保護僅適用於允許登錄用戶訪問/api路由和管理用戶訪問/api/admin路由。

我需要像「currentUser」字段,我可以從任何地方訪問,並檢查它在我所有的路線。

回答

0
  1. 你的每個用戶都需要id。
  2. 當您驗證用戶時,您檢查他的ID是否正確。
  3. 當用戶嘗試修改任何數據時,您必須檢查這些數據是哪一個。這些檢查在路線中。 (例如,每個用戶的配置文件都有這個用戶ID,並且在更新時添加條件'profileUserId === authenticateUserId')

如何在身份驗證過程中獲取userId? 如果你不確定如何實現它,你應該閱讀它,因爲它是重要的安全功能,例如在http://passportjs.org/docs(這是該作業的超級模塊)。 總之,如果您通過會話進行身份驗證,則會將ID存儲在會話中。

0

一個選項是公開一組不接受用戶標識的路由。

示例: 而不是/ profile/{id},expose/myprofile。

然後從令牌/ cookie中獲取用戶的ID並進行相應的db/api調用。如果你需要兩個路由來完成不同的角色,那是你的中間件的責任。

此外,還有一個名爲Connect-AccessControl的中間件庫,它可能已經滿足您有關寧靜訪問控制(無恥插件)的使用案例。

相關問題