Ben Zend Framework üzerine benim tabanlı uygulama var. Ben kimlik doğrulaması için Zend_Auth
kullanıyorum, ama açıkçası, ben gördüğüm örnekler ya benim ihtiyaçları için çok basit ya da karıştırmayın, çünkü Zend_Acl
Benim için çalışacaktır eğer emin değilim ben.
Ben Kaynakları olarak benim uygulamada elementlerin düşünüyordum ve bu Kaynakları Ayrıcalıklar sahip olabilir. Kaynak Ayrıcalıklar içeren roller dinamik olarak tanımlanan kullanıcılara atanır. Ben normalize tablolarda bu bilgileri saklamak ediyorum.
- Kullanıcılar Rolü var
- Bir Rol birden Kaynakları olabilir
- Kaynakları birden Ayrıcalıkları olabilir
Roller gerçekten hiçbir hiyerarşi ile Kaynak Ayrıcalıklar sadece koleksiyonları. Bir Kaynak bir örnek 'Sayfa' olacaktır. Herkes sayfalarını görüntüleyebilir, ancak kimliği doğrulanmış bir kullanıcı, 'ekle', 'edit' gerek, ya da sayfaları başka bir şey yapmak için ayrıcalık 'sil' olacaktır.
Bu Zend ACL ile örgü mu? Benim için sorun yaratmak için gidiyor bir şekilde ACL düşünüyor muyum?
My Solution
Typeonerror kredi alır, ama burada benim özel çözüm bulunuyor.
Ben sadece geçerli kullanıcı rolünü yüklemek için Zend_Acl
, benim kullanımı kolaylaştırmak için genişletilmiş:
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);
}
}
I resource
, privilege
döndüren bir sorgu çalıştırmak ACL doldurmak, ve role_id
sütunlar için. role_id
sütun kullanıcının rolü bu ayrıcalığa sahip değilse set sonuç sıfırdır.
$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']);
}
}