如何检查嵌套数据的更改是不是允许

Posted

技术标签:

【中文标题】如何检查嵌套数据的更改是不是允许【英文标题】:How to check if the change in nested data is permissible如何检查嵌套数据的更改是否允许 【发布时间】:2017-07-18 14:09:45 【问题描述】:

我们在前端的 Web 应用程序中有一个嵌套的 JSON 结构,例如 Rows > Columns > Elements > Rows > Columns > Elements ...

我们还有一个 API 调用,它将整个数据作为 JSON 发送到后端。

在后端,我们有一组权限,例如列大小更改、行背景更改、元素顺序更改等,这些权限对各种类型的用户都是允许或拒绝的。

我们想在后端识别嵌套结构的变化是否允许。

示例1【更新数据】:

用户更改了“列”的大小,其中大小表示为“列”对象中的属性。

示例 2 [删除/添加数据]:

用户已从“列”中删除/添加了“元素”。

我们知道我们可以对整个树进行完全遍历,并了解更改是否允许,但我们正在为并发连接和许多用户/大树寻找更好、更快、资源节省的解决方案。


这个问题对于不同的技术似乎是通用的,但我想让你知道我们在后端使用 Laravel / Lumen / Dingo,在前端使用 Ember.js。

感谢阅读和帮助:)

【问题讨论】:

一个有趣的问题是您如何存储数据。因为,如果您将其存储在关系数据库中,则所有内容都有唯一的 id。使用它。 【参考方案1】:

我认为您可以为每个更改设置类型。例如列更改是----> colChange(或simpleChange)。使用 json 发送更改类型。可以通过更改类型检查权限。也可以有更改类型的组,并且可以对组进行许可。如果您不为每次更改发送数据,则必须有用户更改堆栈(每次用户更改时将更改类型推入堆栈)。将带有 json 的堆栈发送到后端。

【讨论】:

Vazg 但问题是我们不能相信来自前端的更改类型 你可以相信为什么不呢?如果无法访问该变量,则没有人可以更改它,为什么您不信任?您还可以对信息进行加密,以获得安全的信息。 用户可以随时更改来自前端的内容 :) 它的不安全加密仍然会在前端完成,所以它也不安全【参考方案2】:

你可以有一个返回权限的API(有模型Permission)。

然后使用ember-can 在前端检查您需要的任何操作的权限。

这样可以保证你在从前向后发回更新数据时,符合后端定义的权限,不需要多次后退

【讨论】:

但是用户可以在他们已经在前端时修改这个权限,对吧?这可能不安全,所以仍然需要在后端检查权限?有什么想法吗? @ArmeniaH 是的,你也应该在后端检查它【参考方案3】:

一种选择是不将整个 JSON 发送到服务器,而是发送 json 补丁(请参阅http://jsonpatch.com/)。然后在服务器上,制定有效地将补丁中的路径散列到权限的规则。换句话说,由于您只发送更改而不是整个 JSON,因此需要解析整个内容

【讨论】:

感谢鲁本的快速响应。但是在这种情况下,我们是否可以100%确定经过一些操作后,后端和前端的数据是否总是100%相同和相同?我们如何处理一个案例,其中一个调用在其中一个操作期间被后端拒绝:) 您可以做的一件事是在服务器上维护给定文档的修订版本。在客户端上生成补丁时,创建补丁的修订版将作为有效负载的一部分添加。如果服务器收到不同步的补丁,那么您可以着手处理这种情况(在这种情况下,要求客户端发送整个 JSON 并重新计算...)。 嗨鲁本。据我了解,我们可以在后端调用时在前端有一些文档的散列并与补丁一起发送,后端将运行补丁计算散列并检查这些散列是否相等?

以上是关于如何检查嵌套数据的更改是不是允许的主要内容,如果未能解决你的问题,请参考以下文章

PHP:如何检查给定组的成员是不是允许更改模型

Spark Scala,如何检查数据框中是不是存在嵌套列

Ruby Style:如何检查嵌套的哈希元素是不是存在

Ruby Style:如何检查嵌套的哈希元素是不是存在

如何在 mongodb/mongoose 的嵌套数组中检查是不是存在并更新对象?

如何在 Azure 数据工厂触发时检查是不是正在上传某些文件(允许在 ADF 中上传时读取文件)