Node.js / Angular.js管理员授权路由

时间:2015-05-08 18:36:35

标签: angularjs node.js express

我正在使用JSON Web令牌进行身份验证的MEAN应用程序。基本上每个请求,我都在检查用户是否有有效的令牌。如果是这样,他们可以进入路线,否则他们将返回登录页面。

我想让某些路由/ admin / etc ...只能由同时也是管理员的登录用户访问。我在mongo中设置了一个isAdmin标志。我是nodejs的新手,想知道检查这个的最佳方法是什么。我是否在路线的角度边做?或者我可以以某种方式创建基于权限的身份验证令牌?作为参考,我遵循MEAN机器书中的代码,特别是在这里 -

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

1 个答案:

答案 0 :(得分:2)

首先,必须在服务器端完成授权决策。如你所建议的那样在Angular.js中在客户端执行它也是一个好主意,但这只是为了改善用户体验,例如没有向用户显示他们无法访问的内容的链接。

使用JWT,您可以在令牌中嵌入有关用户的声明,如下所示:

bool tryAgain = false;
do
{
    cout << "Enter the seat that you'd like to place the passenger in: "; cin >> aisle;
    aisle = toupper(aisle);
    switch (aisle){
        case 'A':
            temp = 0;
            break;
        case 'B':
            temp = 1;
            break;
        case 'C':
            temp = 2;
            break;
        case 'D':
            temp = 3;
            break;
        default:
            cout << "Input error, please re-enter an aisle (A, B, C, or D)";
            tryAgain = true;
            break;
    }
}
while (tryAgain);

要映射表达路由的权限,您可以使用connect-roles构建干净且可读的授权中间件功能。假设您的JWT是在HTTP标头中发送的,并且您拥有以下(天真)授权中间件:

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

这样,您就可以在路由上强制执行授权策略,如下所示:

// 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();
        }
    });
})

请注意,发布&amp;有更好的选择。验证JWT,例如express-jwt,或将passportpassort-jwt结合使用