首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在数据库和代码中存储不可更改的数据

在数据库和代码中存储不可更改的数据
EN

Software Engineering用户
提问于 2020-03-23 11:04:40
回答 2查看 1.1K关注 0票数 2

嗨,我试图在我的NodeJS ExpressJS支持的API服务器上创建一个基于角色的动态路由授权系统。

设想情况:

  • 会有一些角色,如Admin、StandardUser等,它们不能被编辑或删除。
  • 授权用户可以动态添加更多的角色。当然,这些角色可以编辑或删除。
  • 授权用户可以设置所有路由权限。他们可以设置角色A,可以使用路由X。他们可以为所有类型的角色设置角色。动态角色或“不可更改”的角色,如Admin和StandardUser。

现在,我的场景显示,由于我的动态角色,我需要一个角色表,需要一个RoutePermissions表来动态地为我的角色分配路由访问权限。然而,我无法找到一种方法来存储我的“不变”数据。

  1. 我应该把我的“不变”(我不知道是否有一个术语)放在哪里。请让我知道。)角色数据。我应该把SuperAdmin和StandardUser角色放在哪里?因为如果我将它们放在DB中的roles表中,我的动态数据表中将有两个不可更改的行。
  2. 我应该把我的“不变”路线数据放在哪里。由于路由(POST /users/deactivate)是在系统中编码的,所以我认为将它们放在数据库中是不正确的。因为我认为,数据库应该只包含动态数据,但我的路由不是动态的。
  3. 如果我不将我的“不变”数据放到DB中。我可以将它存储在代码中,比如枚举或consts,但是如何动态地使用它们创建权限呢?因为每个角色的权限都是动态的。(即使对于Admin和StandardUser,记住它们不是动态角色。)
EN

回答 2

Software Engineering用户

回答已采纳

发布于 2020-03-23 12:27:43

数据是“不变的”并不一定意味着它不能改变。它只是不能通过应用程序进行更改。在每一行上设置“不可更改”标志。当true拒绝更改数据时。当false可以改变它。你如何实施这一点取决于你有多偏执。

如果将其限制在应用程序层,那么对数据的所有修改都必须经过应用程序层,否则即使数据库表中有“不可更改”的标志根据您的需要,这可能是可取的。

您可以编写存储过程以强制执行此行为。撤消所有用户的所有插入、更新和删除权限,但拥有存储过程的用户除外。这迫使所有数据修改都要经过存储过程。

将代码中的数据和数据库中的数据混合起来,虽然并非不可能,但确实增加了测试的工作量。“代码中的数据”在逻辑中显示了一个分叉,必须在任何地方进行测试。虽然这一开始并不是一个负担,但这将开始拖到您的进程后面。

保持简单。把它当作数据保存。决定您的基础设施的哪一层应该强制数据的不可变性( NodeJS中的app层或数据库中的存储过程)。

票数 8
EN

Software Engineering用户

发布于 2020-03-23 12:28:18

将一些数据存储在您的DB中并没有本质上的错误,这些数据以后永远不会更改。只需确保没有简单的方法来处理这些数据。

  1. 我应该把SuperAdmin和StandardUser角色放在哪里?

只需将它们放在您的角色表中,但是在该表中引入一个布尔型“只读”列。因此,您可以标记不应被应用程序更改的记录,并且应用程序可以相应地进行操作。

如果您希望确保没有人以不一致的方式更改该数据,请实现一个正确的检查,该检查将验证是否所有预期记录都在角色表中,以及它们的预期内容。找到一个可以执行此检查的位置或进程(例如,在服务器启动时,或者在某些编辑角色表的过程中,这种检查不够频繁)。

  1. 我应该把我的“不可更改”的路由数据放在哪里?

我不清楚您是否需要DB中的路由数据,但如果您需要它,因为您也有“可变”的路由数据,并且希望用“不可更改”的数据来管理这些数据,那么可以应用与#1相同的策略:

  • 使用自定义的“只读”标志标记数据,使其与可更改的数据区分开来。
  • 验证没有人篡改数据,数据库中存储的路由是否与代码中硬编码的路由匹配。

  1. 如果我不把我的“不可更改”的数据给DB ..。

忘了这个吧。只需将数据存储在DB中即可。

票数 5
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/406877

复制
相关文章

相似问题

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