2011-01-11 57 views
5

我正在創建自定義攝影CMS系統並需要實現用戶身份驗證和權限系統。業界通常的慣例是創建這樣的模式。如何構建cms的用戶權限

基本上我需要有用戶,並且用戶可以是不同類型的。有些用戶可以說只能創建畫廊,其他用戶只能編輯它們,或者只能編輯某些畫廊等。所以應該如何構建。我正在使用MySQL數據庫,我正在使用PHP來編寫CMS。

我試圖尋找在谷歌不過才發現這解釋瞭如何創建實際的MySQL數據庫用戶的文章。我會很感激鏈接到一篇文章,這篇文章解釋瞭如何完成這些東西。

預先感謝您。

+0

看看PEAR Live_User。它有點舊,從未成爲標準,但它處理大多數微管理權限。 – mario 2011-01-11 06:40:08

回答

5

對於這個問題有兩種常見的方法,都涉及分崩離析所允許的操作成離散的東西,你可以命名。 (刪除帖子,創建畫廊,升級代碼,轉儲數據庫,啓動導彈,打開車庫門。)在位圖中爲每個位圖提供一個位圖(如果您打算擁有少於32個權限,這是一個很好的和緊湊的存儲機制;如果你認爲它會增長超過32個權限,一個典型的整數的大小,那麼也許在你的數據庫中的表。)

所以,您可以映射用戶直接權限(「我想要授予gallery_createsarnold「),或者您可以通過用戶類映射用戶和權限(」我想授予gallery_createart_curator類的所有成員;然後我希望將用戶sarnolddocent提升爲art_curator「)。

如果直接用戶映射到許可,您可以在部署多年後發現奇怪的權限的大雜燴。如果將用戶映射到類,則可能會發現自己具有人爲類的用戶,因爲您信任一個具有特權的特定人員,但不信任其他特權。

搞清楚解決這一映射的最佳方法仍然是一個懸而未決的問題;我已經寫了關於不同類型的許可模型Modelling a permissions system,這些模型可能太多或可能太少,這取決於您希望系統變得多麼複雜。

如果你想只存儲權限的位圖(例如,Linux內核的實施CAPABLE()CAP_SYS_ADMINCAP_DAC_OVERRIDE,等等),那麼你可以用添加新的特權東西很簡單:

if (requested_new_permission == "CAP_SYS_ADMIN") 
    user->permissions |= CAP_SYS_ADMIN; 
else if (requested_new_permissions == "CAP_DAC_OVERRIDE") 
    user->permissions |= CAP_DAC_OVERRIDE; 

...

然後,當你需要測試的功能:

if (CAPABLE(user, CAP_SYS_ADMIN)) 
    reboot_server(); 

和宏觀CAPABLE()可以看起來像:

的#define兼容(用戶,帽)((用戶) - >權限&(帽))

(原諒C,我只是不知道PHP的非常好;我一直被迫修復太多的PHP錯誤,想自己學習。)

如果你想通過用戶類映射用戶的權限,那麼它可能是三個表:一個users表,groupsclasses表和permissions表。 classesuser_idpermission_id的列。當您需要檢查是否可以授予權限時,請選擇用戶的班級,然後選擇班級中的權限。 (它也已經多年,因爲我已經手寫的SQL,我敢肯定,一個查詢可以給你一個是或否的答案,但我不知道這是否將是一個多表連接或使用子查詢,或者如果它會是更容易使兩個查詢數據庫。:)

希望這有助於。