目前我只用像這樣的數據庫表:制定許可制度的有效方式是什麼?
access: home,register,login
然後在每一頁:
if(!Functions::has_rights('content'))
{
Functions::noAccess();
}
有沒有更有效的方法與PHP MySQL的&做到這一點?我可能想要訪問一個頁面的多個部分,例如,用戶可以閱讀一個頁面,但不對其進行評論,而且我不想爲每個模塊構建單獨的系統。
目前我只用像這樣的數據庫表:制定許可制度的有效方式是什麼?
access: home,register,login
然後在每一頁:
if(!Functions::has_rights('content'))
{
Functions::noAccess();
}
有沒有更有效的方法與PHP MySQL的&做到這一點?我可能想要訪問一個頁面的多個部分,例如,用戶可以閱讀一個頁面,但不對其進行評論,而且我不想爲每個模塊構建單獨的系統。
我相信你在找什麼是訪問控制列表,你的問題模型分成兩件事情:對象和角色。
我不想強加給它,但使用的框架是有效的,我相信,Zend框架規定,看看here
您還可以針對「PHP ACL」的替代品,在this SO question。
我建立了一個使用「* 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
功能)
如果您正在使用某種形式的路由,將是有意義的,讓您的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來查看列表。
Zend_Acl是我在其中一個站點使用的唯一ZF,它非常棒。除非你想通過ACL的理論去了解更多關於它的知識(我經常喜歡這樣做),我強烈建議你把它放在那裏。 – Hans 2010-06-12 13:00:51