node.js 数据访问acl权限
node.js data access acl permission
嗨,谁能帮帮我。我希望用户只能访问他们被允许访问的内容。
我一直在查看几个访问控制列表包。我还没有做出最终决定。
一家拥有多个权限级别的餐厅。
顾客可以下多个订单,并可以看到他点了哪些食物
他也可以只在指定的时间段内修改订单,例如在处理订单之前。
客户只能查看自己的订单及订单所在的阶段
工作人员只能查看菜单下的订单,并说明订单的价格和订单需要多长时间。
另一名员工将负责商店以及物品进出的方式。
一个员工可以负责一个部门,同时允许输入另一个部门下的菜单。
我一直在研究如何将其放入 Express.js 和 mongodb
我看过以下内容
https://github.com/optimalbits/node_acl 主要焦点
https://www.npmjs.com/package/acl
https://www.npmjs.com/package/express-acl
但我还没有达到上面所说的粒度和组合。
许可主要基于数据。对于我该怎么做有点困惑。
任何帮助都会有用
我使用 mongoose 作为我的驱动程序
正如我在评论中所说,此设计具有一些业务逻辑,可能使其不适合常规 ACL 类型的安全控制。从表面上看,似乎更容易找到解决方案的方法是根据您的喜好在 Mongoose 模型或控制器代码中实施您的业务规则。也就是说,使用类似 ACL 的方法执行任何此操作的关键部分归结为您的 URL 设计。例如,很容易让您的 API 使所有订单都可以通过 /api/orders
获得,也许有人会通过 /api/orders?userId=12345
查询他们自己的订单。但这使得大多数基于 ACL 的方法都失败了。相反,您必须按照您希望的层次结构来考虑 API(无论是否所有订单都存储在 Orders Mongoose 模型中,并保留在订单集合中)。
所以以你的第一个需求为例
The customer can place several orders and can see what foods he has ordered
这里的重点是您要保护订单的客户 'owner' 的东西,因此要以这种方式保护它,您需要以这种方式设置路线,例如(假设您使用的是第一个您询问的中间件):
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']);
至少,你会这样做。您可能会提供更多选项,例如 'get' 等。您可以猜到,这意味着您需要在创建单个用户时为它们注册权限(以支持 'ownership' 的概念) .
对于您的第二个要求,
He can also modify the order only within a specified time period e.g. before the order is being processed.
尽管我之前说过,但如果您真的愿意,可以说您可以在 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
});
嗨,谁能帮帮我。我希望用户只能访问他们被允许访问的内容。
我一直在查看几个访问控制列表包。我还没有做出最终决定。
一家拥有多个权限级别的餐厅。
顾客可以下多个订单,并可以看到他点了哪些食物
他也可以只在指定的时间段内修改订单,例如在处理订单之前。
客户只能查看自己的订单及订单所在的阶段
工作人员只能查看菜单下的订单,并说明订单的价格和订单需要多长时间。
另一名员工将负责商店以及物品进出的方式。
一个员工可以负责一个部门,同时允许输入另一个部门下的菜单。
我一直在研究如何将其放入 Express.js 和 mongodb
我看过以下内容
https://github.com/optimalbits/node_acl 主要焦点
https://www.npmjs.com/package/acl https://www.npmjs.com/package/express-acl
但我还没有达到上面所说的粒度和组合。
许可主要基于数据。对于我该怎么做有点困惑。
任何帮助都会有用
我使用 mongoose 作为我的驱动程序
正如我在评论中所说,此设计具有一些业务逻辑,可能使其不适合常规 ACL 类型的安全控制。从表面上看,似乎更容易找到解决方案的方法是根据您的喜好在 Mongoose 模型或控制器代码中实施您的业务规则。也就是说,使用类似 ACL 的方法执行任何此操作的关键部分归结为您的 URL 设计。例如,很容易让您的 API 使所有订单都可以通过 /api/orders
获得,也许有人会通过 /api/orders?userId=12345
查询他们自己的订单。但这使得大多数基于 ACL 的方法都失败了。相反,您必须按照您希望的层次结构来考虑 API(无论是否所有订单都存储在 Orders Mongoose 模型中,并保留在订单集合中)。
所以以你的第一个需求为例
The customer can place several orders and can see what foods he has ordered
这里的重点是您要保护订单的客户 'owner' 的东西,因此要以这种方式保护它,您需要以这种方式设置路线,例如(假设您使用的是第一个您询问的中间件):
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']);
至少,你会这样做。您可能会提供更多选项,例如 'get' 等。您可以猜到,这意味着您需要在创建单个用户时为它们注册权限(以支持 'ownership' 的概念) .
对于您的第二个要求,
He can also modify the order only within a specified time period e.g. before the order is being processed.
尽管我之前说过,但如果您真的愿意,可以说您可以在 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
});