除非您不是託管商,否則您可能不希望通過腳本動態創建數據庫用戶。想一想:
數據庫用戶是一個組件,它與您的應用程序進行交互,而不是與最終用戶進行交互。
所以,堅持一個數據庫爲您的應用程序,並使用專用的表來建立您的ACL。 你的數據庫模式可能是這樣的:
users(id:pk, name)
roles(id:pk, name)
permissions(id:pk, key, description)
permission_role(permission_id:fk, role_id:fk)
role_user(role_id:fk, user_id:fk)
基本上,你這裏有三件事情:
- 用戶:沒什麼特別的。只是一個用戶,可以通過它的唯一定義ID
- 權限:基本上只是一個鍵將被查詢您的腳本中檢查權限存儲。
- 角色:用戶和權限之間的膠水。用戶所屬的角色和權限的總和將定義用戶被允許執行的操作的總和。
這是基本設置。其他表只是幫助表連接在一起。
您的代碼處理剩下的部分。建立一個(或更多更好)的課程來完成繁重的工作。然後將你的ACL實例傳遞給你的用戶類(其他實現當然是可能的,請參閱帖子的底部)。
<?php
class Acl implements AclInterface {
public function hasPermissionTo($action)
{
// Query DB and check if a record exists
// in the role_user table where the
// user_id matches with the current user
// and join the role_id with `roles` and then
// with `permission_role` to see if the user
// is permitted to perform a certain action
}
}
class User {
protected $acl;
public function __construct(AclInterface $acl)
{
$this->acl = $acl;
}
public function hasPermissionTo($action)
{
return $this->acl->hasPermissionTo($action);
}
}
您應該瞭解基本概念。實際的實施取決於你。您可能需要考慮的事項:
- 您是否希望自己的ACL成爲
User
的一部分,或者是一個獨立的組件?
- 你想如何將當前用戶傳遞給ACL?您是否想將當前用戶的實例傳遞給ACL,或者只是將用戶ID傳遞給該實例?
這些問題取決於你喜歡什麼,你的體系結構。 快樂編碼!
感謝。其實我在應用程序和數據庫中也有類似的安排。但是,我沒有完全後利用它認爲具有每個角色的不同用戶就可以解決我的problem.:-/ – kusa4indigeek 2014-11-24 11:44:35
每次訪問有一個數據庫調用involved.Isnt一個性能問題? – 2015-01-21 17:18:35
@nationbest你可能會考慮獲取所有ACL相關數據每個請求後,保存在ACL對象來克服這個問題 – thpl 2015-01-23 06:58:16