2012-07-11 58 views
1

我試圖在我的數據庫中實現一個錶行權限系統(帶有PHP前端和MySQL後端)。它應該遵循Windows文件權限的系統,在這個意義上說:數據庫功能的PHP前端與Windows中的文件權限類似

  • 有網友
  • 每個用戶都可以是多個組的成員
  • 每個組可以是其他的超組的成員
  • 您可以指定整個組,超級組或單個用戶的權限 權限
  • 應該是:用戶權限supercedes子組取代supergroup。 (< - 不是完全必要的)

用戶,創建數據庫條目後,可以指定哪些組/用戶應該擁有哪些權限(讀,寫或留下不可見的)。訪問Web前端時,應僅顯示其擁有權限的條目(使用Cookie登錄系統)。只有他們有寫訪問權限的應該可用於編輯。基本上,我不知道如何有效地創建數據庫來將用戶與他們應該在文件上擁有的權限關聯起來(我知道,一旦我獲得了權限'級別',如何完成剩下的課程)。

我已經嘗試過關係表,但是它變得非常快速。我在文件條目本身(作爲文件的一個字段)中嘗試了用戶/組ID的數組,但這很sl and,只支持64個條目(以及難以實現組/用戶層)。

是否有任何示例,加載項,任何幫助?我精通Javascript,PHP,SQL,HTML及其關係,我正在使用新的PDO擴展重新編寫舊版本。我知道這是可能的領域,但我試過的每一個戰術都只是一場噩夢。

+0

與Windows中的安全性一樣糟糕,文件權限似乎很好(當它們正常工作時)。我的客戶希望模仿該功能。 – StuckAtWork 2012-07-11 12:53:42

+0

這不是LDAP嗎? :? – KingCrunch 2012-07-11 13:40:47

+0

我不知道如何將它應用到MySQL數據庫。它們不是真正的目錄,它們是需要受限訪問的表中的行。 – StuckAtWork 2012-07-11 13:44:19

回答

2

如果您使用的是Oracle,您可以使用角色功能來處理組的層次結構。 Mysql目前不提供這種功能(儘管它似乎在here的列表中)。

與此同時,你可以像這樣模仿這個功能。
創建一個名爲角色的表,其中包含ID和名稱字段並填充一組角色。

enter image description here

創建的表中調用USER_ROLE_PRIVS,將舉行從用戶到一個角色的直接聯繫。

enter image description here

,並創建包含角色的表稱爲role_role_privs被授予其他角色

enter image description here

最後,我們補充一點,我們只希望通過某些特權訪問的表,所以我們添加我們想要的列加上一個可以查看這個數據的角色。

enter image description here

,然後我們創建一個使用數據的角色表加上CURRENT_USER()函數來確定可顯示哪些數據的新視圖。

create or replace view user_student 
    as select s.id, s.name, s.age 
     from user_role_privs urp, student s 
     where urp.user=current_user() 
     and urp.role=s.role 
     union 
     select s.id, s.name, s.age 
     from user_role_privs urp, role_role_privs rrp, student s 
     where urp.user=current_user() 
     and urp.role=rrp.role_id 
     and rrp.granted_role=s.role 

現在,如果你的php允許用戶user1登陸,他們會從視圖中選擇,看看下面的數據 - 這是冥王星是基於直接作用授予和米奇和唐納德看到,因爲業務員的角色被授予以經理的角色。

但是,如果user2登錄,他們將只能看到直接授予他們的角色的記錄,這些記錄是Mickey和Donald。

因此,如果您的應用程序從user_student角色而不是學生表中選擇數據,它將提供讀訪問權限。

要根據角色進行寫入訪問,您可能需要將此想法擴展爲在角色表上包含編輯標誌,並且只有在角色允許的情況下才顯示編輯按鈕和相關功能。

角色應該有權編輯它可以看到的任何數據,以便通過在需要時創建更多角色來讓代碼更簡單。對於插入表格,您可能還需要一個插入前觸發器,以將創建它的用戶的角色插入到student.role列中。您必須決定這應該是具有最高權限還是最低權限的角色,因爲這會授予其他用戶訪問權限。

+0

很全面,謝謝。這與我之前設置的類似,但它變得非常複雜非常快(主要是因爲他們想要管理員屏幕分配角色等,而不使用phpMyAdmin直接編輯表)。儘管我喜歡這個視圖,但我並不瞭解這一點。我會研究它,也許它會簡化一些事情。 – StuckAtWork 2012-08-02 13:03:04

+0

當然 - 這裏的意圖是儘可能地使用內置的功能。在oracle中,角色也是內置的,所以它會更容易。添加角色的mysql的鏈接有點舊,而且它的優先級低,所以它可能會作爲候選者被刪除,但如果他們添加了這個方法,那麼可以使用這種方法替換角色表以使用基本角色。 – 2012-08-02 14:41:42

+0

使我的標準很難的部分是,不僅有幾個角色,更接近於100.我遇到的主要問題是,如果一個條目對大多數(但不是全部)都具有讀/寫權限,用戶,這些表格中可能有大約150個鏈接行。當處理100,000個條目時,我擔心這個表現。如果每個用戶都有一個「權限類型」,這很容易,但他們已經請求了多種權限類型(類似於Windows文件系統權限;用戶,組,子組,子組等等)。桌子變得凌亂。 – StuckAtWork 2012-08-02 14:53:48