2015-05-08 173 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