2015-05-08 146 views
5

我正在使用JSON Web令牌進行使用身份驗證的MEAN應用程序。基本上每個請求,我檢查,看看用戶是否有一個有效的令牌。如果是的話,他們可以通過該路線,否則他們將返回到登錄頁面。Node.js/Angular.js管理員授權路由

我想製作某些路線/管理/等...只有登錄的用戶也是管理員。我在mongo中設置了一個isAdmin標誌。我對nodejs很陌生,想知道檢查這個的最好方法是什麼。我是否在路線的角度方向上做?或者我可以以某種方式在身份驗證上創建基於權限的令牌?作爲參考,我下面從平均機本書的代碼,尤其是在這裏 -

https://github.com/scotch-io/mean-machine-code/tree/master/17-user-crm

回答

2

首先,授權決定必須在服務器端完成。按照您的建議在Angular.js的客戶端上做這件事也是一個好主意,但這只是爲了改善用戶的體驗,例如不向用戶顯示他們無權訪問的鏈接。

隨着JWTs,你可以嵌入有關令牌裏面的用戶聲明,就像這樣:

var jwt = require('jsonwebtoken'); 
var token = jwt.sign({ role: 'admin' }, 'your_secret'); 

要地圖的權限來表達的路線,你可以使用connect-roles打造乾淨,可讀授權中間件功能。假設例如您的智威湯遜在HTTP頭中發送和您有以下(幼稚)授權中間件:

// Naive authentication middleware, just for demonstration 
// Assumes you're issuing JWTs somehow and the client is including them in headers 
// Like this: Authorization: JWT {token} 
app.use(function(req, res, next) { 
    var token = req.headers.authorization.replace(/^JWT /, ''); 
    jwt.verify(token, 'your_secret', function(err, decoded) { 
     if(err) { 
      next(err); 
     } else { 
      req.user = decoded; 
      next(); 
     } 
    }); 
}) 

有了這一點,你可以執行你的授權策略航線上,像這樣:

var ConnectRoles = require('connect-roles'); 
var user = new ConnectRoles(); 

user.use('admin', function(req) { 
    return req.user && req.user.role === 'admin'; 
}) 

app.get('/admin', user.is('admin'), function(req, res, next) { 
    res.end(); 
}) 

請注意,發行&驗證JWT有更好的選擇,如express-jwt,或使用passportpassort-jwt