繁体   English   中英

了解MySQL的Web App权限

[英]Understanding Web App Permissions with MySQL

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

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

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

由于userId仅存在于时间轴实体上,因此我需要执行以下操作:

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中有很多优化)
  • 按照您的建议向表中添加外键,并承担更改的开销(您的模型/数据访问层无论如何应该将问题隐藏在更高层中)
  • 实现某种自定义缓存
    • 您可以在高速缓存表(可能在Redis这样的nosql数据库)中创建高速缓存表之类的东西,这会非常快(一旦检索到权限,它就可以在高速缓存中保留一段时间,但要注意后果,例如更改权限)不会立即生效)
    • 你可以使用内存缓存
    • 您可以在应用中进行自定义的内存缓存(为此请谨慎使用会话,与会话相关的漏洞可能会让攻击者获得比预期更多的访问权限)

基本上,总的来说,这是我认为的计算/存储权衡。 您要么每次都计算权限,要么将它们预先计算后存储在某个地方,这意味着您有时需要重新计算它们(但可能并非始终如此)。

正确的解决方案取决于您的实际情况。 我的经验是,在大多数情况下,不值得修复尚未损坏的东西(除非您当然知道在您要使用的情况下它不会以这种方式工作)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM