在节点JS的权限

我正在使用快递和续集制作应用程序。 有用户和pipe理员。 现在,我正在通过中间件处理权限。

说有一个消息,用户可以改变:

var Message = sequelize.define('Message', { content: Sequelize.STRING, secret: Sequelize.STRING }); var message = Message.build({ content: 'i like frogs', secret: 'i like hogs more!' }); app.put('/message', requireRole('user'), function(request, response) { message.updateAttributes(request.body.content); response.writeHead(200); response.end('secret updated'); }); 

我想有一些更复杂的权限。

什么是这样做的好方法? 在这个例子中,我希望用户能够更新消息的content ,但不是它的secret

我可以把它烧成每一条路线,但是随着车型的改变,似乎会变得很痛苦。

 app.put('/message', requireRole('user'), function(request, response) { var attrs = {}; var role = request.session.user.role; if (role == 'user' || role == 'admin') { attrs.content = request.body.content; } if (role == 'admin') { attrs.secret = request.body.secret; } message.updateAttributes(attrs); response.writeHead(200); response.end('secret updated'); }); 

有没有更好的方法来做到这一点? 我想我可以把这个逻辑放到Sequelize的定义模型的get / set方法中,但是不知道这是否是更清洁的。

在我看来,把这种逻辑放到模型中根本就不是个好主意。 特别是在模型的制定者,因为这与两个OOP固体原则 (单一责任原则和界面分离原则)相冲突。

通常有一种名为ACL(访问控制列表)的模式,您可以在其中定义哪些angular色可以对某些资源执行任何操作 。 例如: https : //www.npmjs.org/package/acl

当您将ACL注入到您的项目中时:

  if (role == 'user' || role == 'admin') { attrs.content = request.body.content; } if (role == 'admin') { attrs.secret = request.body.secret; } 

将被这样的东西取代:

 request.body.forEach( field => { ACL.isAllowed( request.session.user.role, field, 'edit', ( error, response ) => { if( response ){ attrs[ field ] = request.body[ field ]; /** validate me! */ } } ); } 

);

正如我从你的例子看,提供npm包应该是足够的。

看一下Passport ,使用起来相当简单,并且允许您在几秒钟内实现本地身份validation和OpenID。