首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >node.js数据访问权限

node.js数据访问权限
EN

Stack Overflow用户
提问于 2018-12-06 16:27:52
回答 1查看 949关注 0票数 0

你好,谁能帮帮我吗?我希望用户能够只访问他们允许访问的内容。

我一直在查看几个访问控制列表包。我还没有做出最后的决定。

有几级许可的餐馆。

  1. 顾客可以下几个订单,看他点了什么食物。
  2. 他也只能在指定的时间内修改订单,例如在处理订单之前。
  3. 客户只能查看自己的订单和订单所处的阶段。
  4. 员工只能在菜单上查看订单,并说明订单的成本和订购所需的时间。
  5. 另一名工作人员将负责商店和东西的进出。
  6. 工作人员可以负责一个部门,同时允许输入另一个部门下的菜单。

我一直在研究如何将其应用到Express.js和mongodb中。

我看了以下几点

acl主要焦点

https://www.npmjs.com/package/acl https://www.npmjs.com/package/express-acl

但我还没有得到我上面所说的粒度和混合。

这一许可将主要基于数据。我对如何处理这件事感到有点困惑。

任何帮助都是有用的。

我用猫鼬当我的司机

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-07 17:43:08

正如我在评论中所说的,这个设计有一些业务逻辑,这可能使它不适合常规的ACL类型的安全控制。从表面上看,解决方案似乎更容易的方法是根据您的喜好在Mongoose模型或Controller代码中实现您的业务规则。尽管如此,使用类似ACL的方法来完成这一切的关键部分可以归结为您的URL设计。例如,让API能够通过/api/orders获得所有订单是很有诱惑力的,而且可能有人会通过/api/orders?userId=12345查询自己的订单。但这使得大多数基于ACL的方法失败了。相反,您必须按照您想要保护的层次结构来考虑API (不管是否所有订单都存储在orders Mongoose模型中,并且坚持在Orders集合中)。

因此,以您的第一个需求为例

顾客可以下几个订单,看他点了什么食物。

这里的重点是,您是由订单的客户‘所有者’来保护产品的,因此要以这种方式保护它,您需要这样设置您的路线,例如(假设您使用的是您询问的第一个中间件):

代码语言:javascript
复制
app.post('/api/customer/:customerId/orders', acl.middleware(), (req, res, next) => { 
  const order = new Order(req.body); // TODO: whitelist what info you take in here
  order.customerId = req.user.id; // assuming you have a logged-in user that does this
  order.save(e => {
    if (e) return next(e);
    return res.status(201).send(order);
  });  
});

为了支持这一点,您可以将ACL信息注册如下:

代码语言:javascript
复制
acl.allow('12345', '/api/customer/12345/orders', ['post']); 

最低限度,你会这么做。您可能会提供更多的选项,如'get‘等。正如您可以猜测的那样,这意味着每当您创建用户时,都需要为他们注册权限(以支持’所有权‘的概念)。

对于你的第二个要求,

他也只能在指定的时间内修改订单,例如在处理订单之前。

尽管我之前说过,如果您真的愿意的话,您可以在ACL中这样做。例如,您可以为状态创建URL帐户,比如'/api/customers/12345/orders/modifiable/6789',,但在我的经验中,这变得很难维护。你最好把这个逻辑放在控制器或猫鼬逻辑中。在控制器中这样做可能更简单,除非您计划在Express应用程序之外使用您的猫鼬模型。类似的情况(请注意,在本例中不使用ACL,但如果需要,可以使用):

代码语言:javascript
复制
app.param('orderId', (req, res, next, id) => {
  Order.findById(id, (err, order) => {
    if (err) return next(err);
    if (order) {
      req.order = order;
      return next();
    }
    const notFound = new Error('Order not found');
    notFound.status = 404;

    return next(notFound);
  });
});

app.put('/api/orders/:orderId', (req, res, next) => {
  if (req.order.status !== 'pending') {// or whatever your code setup is
    const notProcessable = new Error('Cannot modify an order in process');
    notProcessable.status = 422;
    return next(notProcessable);
  }

  // handle the modification and save stuff
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53655727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档