2014-06-12 51 views
3

我目前使用Symphony 2庫在PHP中構建應用程序,但我想這個問題適用於任何類型的Web應用程序。這是基本的基礎設施,我想實現:如何實現基於組和角色的權限系統?

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

一個例子不執行其他角色組

  • 一組「作家」落實「作家」的角色和「評論主持人」的角色
  • 一組「管理員」實現了「管理員」角色
  • 用戶「亨利」是作家羣體的一部分,和管理員組
  • 用戶「亨利」實現了「所有者」角色

角色情感該用戶是「作家」,「評論主持人」,「管理員」和「所有者」。

編輯

它是一個很好的做法還是不要有這種行爲:用戶可以從自己的組繼承的角色,可以有個人的作用也是如此。 如果是這樣,如何讓它變成現實?

我認爲5個表:

用戶

  • ID

角色

  • ID

UserRole的

  • id_user(FK)
  • id_role(FK)

組:

  • ID

GroupRole

  • id_group(FK)
  • id_role(FK)

用戶組

  • id_user(FK)
  • id_group(FK)

這可能是工作和存在的主要問題是防止添加用戶已經從它所屬的組的個人作用。

它似乎有點複雜。有沒有更好的方法來做到這一點?

感謝

+0

那麼......問題是什麼?看起來你已經全部計劃好了,所以你需要我們幫忙的是什麼? – Majenko

+0

編輯我自己的帖子;) – Rybus

+0

你基本上是在描述一個相當普通的系統,並且已經制定了正常的表格。有一個角色也在他們的團隊中的用戶有問題嗎?這真的有影響嗎?他們有角色,無論他們從哪裏獲得角色,或者他們有兩次角色 - 如果他們擁有角色都沒有關係。 – Majenko

回答

5

你所描述的是一個相當普通和通用的權限系統。這是一個以多種形式在世界各地使用的系統。事實上,你最有可能通過使用這個網站以類似的形式使用它。當然,如果你曾經使用過使用phpBB的論壇,你將會使用它。

你所描述的表格非常標準。一個用戶,許多組,一個表格來鏈接它們。一個用戶,許多角色,一個表格來鏈接他們。一個組,很多角色,一個表來鏈接它們。這都是非常標準的東西。

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

還有其他類似的方式可以使用較少的表達到相同的結果,在某些情況下可能更優化,或可能不太理想,這完全取決於您的系統。最常見的方法是基本上將聯接表壓縮到「單個」結束表中的單個字段中,以便用戶可以有一個字段,其中包含角色列表,另一個字段中包含組的列表它。與羣組類似 - 一個包含角色列表的字段。你如何編碼這些信息取決於你。我通常使用JSON將數組信息編碼到表格字段中,因爲它是自我逃避的。它所做的只是將處理從SQL服務器轉移到接口腳本。

如果一個用戶具有同一個角色,並且從一個組中單獨授予並繼承,那麼這很重要嗎?它不應該。如果一個角色由一個標誌表示用戶是否允許執行特定功能,並且他們獲得了該標誌兩次,他們是否擁有更多標誌?一個國旗可以關閉,開啓,還有更多功能嗎?通常不,不。你必須走出自己的方式來設計一個可以這樣做的系統。

更令人感興趣的是當你有兩個衝突角色會發生什麼 - 一個說他們可以做某件事,一個說他們做不到。你選擇哪一個 - 讓他們這樣做的一個或阻止他們這樣做的那個?當然,這完全是你的選擇。順便提一下,phpBB有3個權限狀態 - YES,NO和NEVER。 YES可以覆蓋NO,但不能覆蓋NEVER。

+0

你無法寫出更容易理解的東西!非常感謝你@Majenko。我會按照我在問題帖子中寫的方式來完成。 – Rybus

0

你正在談論RBAC。它可以通過例如PHP-RBAC來實現。對於Symphony,我發現UserRbac