我的應用程序基於Zend框架。我使用Zend_Auth
進行身份驗證,但我不知道是否會Zend_Acl
爲我工作,因爲坦率地說,我見過的例子是無論是對我的需要過於簡單化或迷惑我。Zend ACL適合我的需求嗎?
我在考慮我的應用程序中的元素作爲資源,這些資源可以擁有特權。包含資源權限的角色是動態定義分配給用戶的。我將這些信息存儲在規範化的表格中。
- 用戶有一定的作用
- 一個角色可以有多個資源
- 資源可以有多個權限
角色其實只是沒有層次資源權限的集合。一個資源的例子是'Page'。每個人都可以查看頁面,但是經過身份驗證的用戶需要「添加」,「編輯」或「刪除」權限,才能對頁面進行其他操作。
這是否網與Zend ACL?我是否以一種會給我造成問題的方式思考ACL?
我的解決方案
Typeonerror得到榮譽,但在這裏我具體的解決方案。
我伸出Zend_Acl
簡化我的使用,因爲我只加載當前用戶的角色:
class My_Acl extends Zend_Acl
{
protected $_role_id;
public function setRole($role_id)
{
$this->_role_id = $role_id;
return $this->addRole($role_id);
}
public function getRole()
{
return $this->_role_id;
}
public function deny($resource, $privilege)
{
return parent::deny($this->_role_id, $resource, $privilege);
}
public function allow($resource, $privilege)
{
return parent::allow($this->_role_id, $resource, $privilege);
}
public function isAllowed($resource, $privilege)
{
return parent::isAllowed($this->_role_id, $resource, $privilege);
}
}
要填充我執行一個查詢返回resource
,privilege
,並role_id
列的ACL。如果用戶的角色沒有該特權,則role_id
列在結果集中爲空。
$acl = new My_Acl();
$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
$userInfo = $auth->getStorage()->read();
$acl->setRole($userInfo->role_id);
} else {
$acl->setRole('');
}
// QUERY HERE
foreach ($privileges as $privilege) {
if (!$acl->has($privilege['resource'])) {
$acl->addResource($privilege['resource']);
}
if (is_null($privilege['role_id'])) {
$acl->deny($privilege['resource'], $privilege['privilege']);
} else {
$acl->allow($privilege['resource'], $privilege['privilege']);
}
}
我看到的用戶,角色的等級和資源在你的榜樣。我有用戶,角色,資源,特權。用戶具有一個角色,角色可以具有多個資源,並且資源可以具有多個權限。我是否誤解了解決方案中的某些內容? – Sonny 2010-02-17 15:11:15
聽起來很正確。用戶設置的方式是,每個用戶從其父節點繼承權限。所以「管理員」獲得所有「客人」和「成員」特權。在管理員下,我允許「全部」,然後拒絕對所有資源執行「清除」操作,並僅對「cms:comments」資源拒絕「創建」操作。所以他們仍然可以訪問「cms:comments-> view」或「cms:comments-> moderate」操作。 – typeoneerror 2010-02-17 16:50:42
增加了一些代碼。 – typeoneerror 2010-02-17 16:51:50