【问题标题】:Understanding Web App Permissions with MySQL使用 MySQL 了解 Web 应用程序权限
【发布时间】:2017-10-21 05:16:09
【问题描述】:

假设我有一个使用以下 4 个实体定义的架构:

Users 
  -> Timeline (fk: userId)
    -> Entries (fk: timelineId)
      -> Tags (fk: entryId), where fk means foreign key.

现在,假设我想检查 Web 应用程序是否有用户有权删除特定标签。现在我使用基本身份验证,检查数据库中是否存在用户的电子邮件//密码,如果存在,则获取 userId。

由于 userId 仅存在于 Timeline 实体上,我觉得我需要执行以下操作:

DELETE t.* FROM `tags` AS t
  INNER JOIN `entries` AS e ON t.entryId = e.id
  INNER JOIN `timelines` AS tl ON e.timelineId = tl.id
WHERE
  tl.userId = ? AND
  t.id = ?

这种方法有效,但我觉得它效率低下。相反,我可以为每个表(例如标签)添加一个 userId FK,但这似乎也是一场维护噩梦。

除了实现某种其他类型的权限系统(例如使用 ACL)之外,我想不出任何其他方法。有什么建议吗?

【问题讨论】:

    标签: mysql web-services security permissions acl


    【解决方案1】:

    我认为您可以从以下几个选项中进行选择:

    • 让它保持原样,直到它真正成为问题并修复它(它可能不会成为问题,MySQL 中有很多优化)
    • 按照您的建议将外键添加到表中并承担更改的开销(无论如何,您的模型/数据访问层应该对更高层隐藏问题)
    • 实现某种自定义缓存
      • 您可以创建类似缓存表的东西,可能在像 Redis 这样的 nosql 数据库中,这会非常快(一旦检索到权限,它可以在缓存中存在一段时间,但要注意后果,因为示例权限更改不会立即发生)
      • 你可以使用内存缓存
      • 您可以在您的应用程序中进行自定义内存缓存(使用会话时要小心,会话相关的漏洞可能允许攻击者获得比您预期更多的访问权限)

    我认为基本上和一般来说这是一个计算/存储的权衡。您要么每次都计算权限,要么将它们存储在预先计算好的某个地方,这意味着您有时需要重新计算它们(但可能不是一直)。

    正确的解决方案取决于您的具体情况。我的经验是,在大多数情况下,修复尚未损坏的东西是不值得的(当然,除非你知道在你想要使用它的场景中它不会那样工作)。

    【讨论】:

      【解决方案2】:

      查看外键here。您可以简单地通过 MySQL 将关系添加到其他表,并在删除父表时级联删除。

      【讨论】:

      • 这与我的要求无关。我正在尝试验证用户是否有权删除特定条目。另外,我不会删除任何父条目,所以我不确定您的回复有何帮助。
      猜你喜欢
      • 2022-01-04
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      • 2011-09-14
      相关资源
      最近更新 更多