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

use*_*560 6 node.js express angularjs

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

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

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

And*_*ers 2

首先,授权决策必须在服务器端完成。按照您的建议在 Angular.js 的客户端执行此操作也是一个好主意,但这只是为了改善用户体验,例如不向用户显示指向他们无权访问的内容的链接。

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

var jwt = require('jsonwebtoken');
var token = jwt.sign({ role: 'admin' }, 'your_secret');
Run Code Online (Sandbox Code Playgroud)

要将权限映射到快速路由,您可以使用connect-roles构建干净且可读的授权中间件函数。例如,假设您的 JWT 在 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();
        }
    });
})
Run Code Online (Sandbox Code Playgroud)

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

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();
})
Run Code Online (Sandbox Code Playgroud)

请注意,有更好的选项来发行和验证 JWT,例如 express-jwt,或将护照与passor-jwt结合使用