2010-06-12 33 views
5

目前我只用像這樣的數據庫表:制定許可制度的有效方式是什麼?

access: home,register,login 

然後在每一頁:

if(!Functions::has_rights('content')) 
{ 
    Functions::noAccess(); 
} 

有沒有更有效的方法與PHP MySQL的&做到這一點?我可能想要訪問一個頁面的多個部分,例如,用戶可以閱讀一個頁面,但不對其進行評論,而且我不想爲每個模塊構建單獨的系統。

回答

3

我相信你在找什麼是訪問控制列表,你的問題模型分成兩件事情:對象角色

我不想強加給它,但使用的框架是有效的,我相信,Zend框架規定,看看here

您還可以針對「PHP ACL」的替代品,在this SO question

+0

Zend_Acl是我在其中一個站點使用的唯一ZF,它非常棒。除非你想通過ACL的理論去了解更多關於它的知識(我經常喜歡這樣做),我強烈建議你把它放在那裏。 – Hans 2010-06-12 13:00:51

3

我建立了一個使用「* NIX類型」權限系統。

我對頁面擁有不同類型的權限(讀取,修改,刪除,評論,投票),併爲每個頁面分配一些位。

所以,比如我有

define ('USER_CANREAD', 1); 
define ('USER_CANMODIFY', 2); 
define ('USER_CANDELETE', 4); 
define ('USER_CANINSERT', 8); 
define ('USER_CANCOMMENT', 16); 
define ('USER_CANVOTE', 32); 

這時如果用戶可以閱讀,評論和投票的權限將是1 + 16 + 32 = 49

要檢查的權限我只是做一個按位並與這些值。

例如user->permissions & USER_CANDELETE檢查,如果用戶可以刪除的頁面(很明顯,我有一個canDelete功能)

1

如果您正在使用某種形式的路由,將是有意義的,讓您的ACL(訪問控制列表)取決於您定義的路由。

我通常在HABTM關係中使用權限表和permissions_users表運行。這樣,當路由匹配時,可以查找權限。如果用戶沒有權限,他將被拒絕訪問。 這可以通過檢查GET,POST,PUT和DELETE的不同類型來改進。

這是因爲我喜歡有機會從網絡界面編輯權限和設置,並允許非IT人員也這樣做(即營銷人員)。

這裏的佈局:

+-----------------------+ 
| permissions   | 
+-----------------------+ 
| id | pattern | method | 
+-----------------------+ 
| 1 |   | GET | # => Will hit the root of your application 
| 2 | users  | GET | # => Will hit users/, usually listing the users 
| 3 | users  | PUT | # => Will hit anyone trying to insert a new user into the system. 
| 4 | users/:id | GET | # => Will hit anyone who tries to view a specific user 
| 5 | users/:id | POST | # => Will hit anyone trying to update a user 
+-----------------------+ 

+-------------------------+ 
| permissions_users  | 
+-------------------------+ 
| user_id | permission_id | 
+-------------------------+ 
| 1  | 1    | # => Will allow to view the root of the application 
| 1  | 2    | # => Will allow to view the users list 
+-------------------------+ 

所以用戶1不具有可改變記錄的任何權利。由於路由定義了不同的請求方法的位置,所以你不能簡單地將POST發送給/ users來查看列表。

相關問題