簡體   English   中英

如何實現基於組和角色的權限系統?

[英]How to implement a group & role based permission system?

我目前正在使用Symphony 2庫在PHP中構建應用程序,但我想這個問題適用於任何類型的Web應用程序。 這是我想要實現的基礎架構:

  • 每個用戶都是一個或多個組的一部分
  • 每個組都實現一個或多個角色
  • 組實施的角色適用於該組中的所有用戶
  • 用戶可以實現不在其組中的其他角色

一個例子

  • 一組'作家'實現'作家'角色和'評論主持人'角色
  • 一組'管理員'實現'admin'角色
  • 用戶'Henry'是編寫組和管理員組的一部分
  • 用戶'Henry'實現'所有者'角色

對該用戶有效的角色是“作家”,“評論主持人”,“管理員”和“所有者”。

編輯

具有這種行為是否是一種好的做法:用戶可以從其自己的組繼承角色,也可以具有單獨的角色。 如果是這樣,如何讓它成為現實?

我想到了5個表:

用戶

  • ID
  • 名稱

作用

  • ID
  • 名稱

UserRole

  • id_user(FK)
  • id_role(FK)

  • ID
  • 名稱

GroupRole

  • id_group(FK)
  • id_role(FK)

用戶組

  • id_user(FK)
  • id_group(FK)

這可能有效,主要問題是阻止用戶從其所屬的組中添加單個角色。

似乎有點復雜。 有沒有更好的方法呢?

謝謝

您所描述的是一個相當正常和通用的權限系統。 它是一種在世界各地以多種不同形式使用的系統。 事實上,你很可能只是通過使用這個網站以類似的形式使用它。 當然,如果您曾經使用過使用phpBB的論壇,那么您將使用它。

您描述的表格非常標准。 一個用戶,多個組,一個表來鏈接它們。 一個用戶,多個角色,一個用於鏈接它們的表。 一組,多個角色,一個鏈接它們的表。 這都是非常標准的東西。

系統負載較重的主要警告是確保您的表和查詢以保持服務器負載的方式進行優化。 這意味着確保在正確的列上有索引等.MySQL命令explain可以真正幫助您檢查您是否正確。

還有其他類似的方法可以使用較少的表來實現相同的結果,這些表在某些情況下可能更優化,或者可能不太理想,完全取決於您的系統。 最常見的方法是將連接表基本壓縮到“單個”結束表中的單個字段中,因此用戶將擁有一個字段,其中包含其中的角色列表,另一個字段具有列表中的組它。 與組類似 - 一個包含其中角色列表的字段。 您如何編碼該信息取決於您自己。 我通常使用JSON將數組信息編碼到表字段中,因為它是自動轉義的。 它所做的只是將處理從SQL服務器轉移到接口腳本。

如果用戶具有從組中單獨授予和繼承的相同角色,這是否重要? 它不應該。 如果某個角色包含一個標志,該標志表示允許(或不允許)用戶執行特定功能,並且他們獲得該標志兩次,那么他們是否擁有更多的標志? 旗幟可以關閉,打開等等嗎? 不通常,不。 你必須不遺余力地編寫一個像這樣的系統。

更有意思的是當你有兩個沖突的角色時會發生什么 - 一個說他們可以做某事而一個說他們做不到。 你選擇哪一個 - 讓他們這樣做的人還是阻止他們這樣做的人? 當然,這完全是您的選擇。 順便說一下,phpBB有3個狀態用於許可 - 是,否,從不。 YES可以覆蓋NO,但不能覆蓋從不。

你在談論RBAC 它可以通過PHP-RBAC實現 對於Symphony,我找到了UserRbac

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM