簡體   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