嗨,任何人都可以帮助我。我希望用户只能访问他们被允许访问的内容。
我一直在看几个访问控制列表包。我尚未做出最终决定。
具有多个权限级别的餐厅。
客户可以下多个订单,并可以查看他订购的食物
他也只能在指定的时间段内修改订单,例如在处理订单之前。
客户只能查看自己的订单以及该订单所在的阶段。
工作人员只能检查菜单中的订单,并注明订单费用和订单时间。
其他人员将负责商店以及事物进出的方式。
工作人员可以负责一个部门,同时允许输入另一个部门下的菜单。
我一直在研究如何将其放入Express.js和mongodb
我看了以下
https://github.com/optimalbits/node_acl主要重点
https://www.npmjs.com/package/acl https://www.npmjs.com/package/express-acl
但是我没有上面提到的粒度和混合。
许可主要基于数据。关于如何解决这个问题,我有些困惑。
任何帮助都会有用
我用猫鼬作为司机
答案 0 :(得分:0)
正如我在评论中说的那样,此设计有一些业务逻辑,可能使其不适用于常规ACL型安全控件。从表面上看,解决方案似乎更容易解决,那就是根据您的喜好在Mongoose模型或Controller代码中实施您的业务规则。就是说,使用类似ACL的方法来完成上述任何一项工作的关键在于您的URL设计。例如,诱使您的API使得所有订单都可以通过/api/orders
获得,也许有人会通过/api/orders?userId=12345
查询自己的订单。但这会使大多数基于ACL的方法失败。相反,您必须根据想要确保其安全的层次结构来考虑API(无论所有订单是否都存储在Orders Mongoose模型中,并保留在orders集合中)。
以您的第一个要求为例
客户可以下几笔订单,并查看他订购的食物
这里的重点是您要通过订单的客户“所有者”保护事物,因此要确保这种安全,您需要以这种方式设置路线,例如(假设您使用的是第一个询问的中间件):
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信息:
acl.allow('12345', '/api/customer/12345/orders', ['post']);
至少要这样做。您可能会提供更多选项,例如“获取”等。您可以猜测,这意味着您在创建单个用户时就需要为其注册权限(以支持“所有权”的概念)。
您的第二个要求
他也只能在指定的时间段内修改订单,例如在处理订单之前。
尽管我之前说过,但如果您确实愿意,可以说可以在ACL中执行此操作。例如,您可以为状态指定URL帐户,例如“ / api / customers / 12345 / orders / modifiable / 6789”,但是根据我的经验,这很难维护。您最好将该逻辑放入控制器或Mongoose逻辑中。除非您打算在Express应用程序之外使用Mongoose模型,否则在控制器中执行此操作可能会更简单。这样的事情(请注意,在这种情况下,请不要使用ACL,不过如果需要的话,也可以使用):
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
});