2012-03-07 172 views
69

我們有一個具有兩種類型用戶的應用程序。根據用戶登錄的方式,我們希望他們可以訪問應用程序的不同部分。Node.js + Express.js用戶權限安全模型

我們如何實現一種安全模型,以防止用戶看到他們無法訪問的內容?

我們是否將安全作爲每個路由實現的一部分?問題在於我們會在請求中有一些重複的邏輯。我們可以將其轉換爲輔助函數,但我們仍然需要記住調用它。

我們是否將安全性作爲全局app.all()路由處理程序的一部分?問題在於我們必須檢查每條路線並根據多種規則執行不同的邏輯。至少所有的代碼都在一個地方,但是......所有的代碼都在一個地方。

回答

120

擁有它的每條路線通常適用於我。這是我做的典型:

function requireRole (role) { 
    return function (req, res, next) { 
     if (req.session.user && req.session.user.role === role) { 
      next(); 
     } else { 
      res.send(403); 
     } 
    } 
} 

app.get("/foo", foo.index); 
app.get("/foo/:id", requireRole("user"), foo.show); 
app.post("/foo", requireRole("admin"), foo.create); 

// All bars are protected 
app.all("/foo/bar", requireRole("admin")); 

// All paths starting with "/foo/bar/" are protected 
app.all("/foo/bar/*", requireRole("user")); 
+0

但是如果只有2個角色可以訪問路由呢? – 2016-04-25 23:22:18

+1

你可以讓'requireRole'代替一個數組?並用'indexOf'檢查。 – 2016-04-26 08:18:03

+0

你可以添加例子嗎?這最後一條路線保護所有以/ foo/bar開頭的路線嗎? – 2016-04-26 11:46:48

6

看看this list對ACL的NodeJS /權限系統。恕我直言OptimalBits node_acl看起來最好。

+1

是否有更新的Node.js ACL模塊列表?我們正在考慮如何在Meteor.js應用中實現ACL。 – 2015-06-22 09:17:54

2

現在有了Node模塊permission。它非常易於使用,與已接受的答案非常相似,但仍添加了一些功能。