我正在使用JSON Web令牌进行身份验证的MEAN应用程序。基本上每个请求,我都在检查用户是否有有效的令牌。如果是这样,他们可以进入路线,否则他们将返回登录页面。
我想让某些路由/ admin / etc ...只能由同时也是管理员的登录用户访问。我在mongo中设置了一个isAdmin标志。我是nodejs的新手,想知道检查这个的最佳方法是什么。我是否在路线的角度边做?或者我可以以某种方式创建基于权限的身份验证令牌?作为参考,我遵循MEAN机器书中的代码,特别是在这里 -
https://github.com/scotch-io/mean-machine-code/tree/master/17-user-crm
答案 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,或将passport与passort-jwt结合使用