【问题标题】:Permissions in Node JSNode JS 中的权限
【发布时间】:2014-04-14 20:29:02
【问题描述】:

我正在使用 express 和 sequelize 制作应用程序。有用户和管理员。现在,我正在通过中间件处理权限。

假设有用户可以更改的消息:

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 方法中,但不知道这是否更简洁。

【问题讨论】:

    标签: node.js security express permissions sequelize.js


    【解决方案1】:

    在我看来,将这样的逻辑放入模型中是个坏主意。尤其是模型的设置器,因为这与两个OOP SOLID principles(单一职责原则和接口隔离原则)冲突。

    通常有一种名为 ACL(访问控制列表)的模式,您可以在其中定义哪些角色可以对某些资源执行任何操作。比如这个: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 包应该足够了。

    【讨论】:

      【解决方案2】:

      我知道这个问题已经很老了,但如果有人遇到同样的问题,在基于 express 的应用程序中有一个article which explain how to integrate ACL

      【讨论】:

        【解决方案3】:

        看看Passport,它使用起来非常简单,并且允许您在几秒钟内实现本地身份验证和OpenID。

        【讨论】:

        • Passport 帮助您进行身份验证而不是访问控制
        猜你喜欢
        • 2021-10-12
        • 1970-01-01
        • 2016-06-08
        • 2020-06-06
        • 1970-01-01
        • 2018-11-14
        • 2021-06-13
        • 2019-03-11
        相关资源
        最近更新 更多