Oparłem moją aplikację na Zend Framework. Używam Zend_Auth
do uwierzytelniania, ale nie jestem pewien, czy Zend_Acl
będzie działać dla mnie, ponieważ, szczerze mówiąc, przykłady, które widziałem są albo zbyt uproszczone dla moich potrzeb, albo wprowadzają w błąd.Czy Zend ACL odpowiada moim potrzebom?
Mam na myśli elementy w mojej aplikacji jako Zasoby, a te Zasoby mogą mieć uprawnienia. Role zawierające uprawnienia do zasobów są definiowane dynamicznie dla użytkowników. Przechowuję te informacje w znormalizowanych tabelach.
- Użytkownicy mają rolę
- rolę może mieć wiele zasobów
- Zasoby mogą mieć wiele Uprawnienia
role są naprawdę tylko zbiory przywilejów Zasobów bez hierarchii. Przykładem zasobu będzie "Strona". Każdy może przeglądać strony, ale uwierzytelniony użytkownik będzie potrzebować uprawnień "dodaj", "edytuj" lub "usuń", aby zrobić cokolwiek innego ze stronami.
Czy jest to zgodne z Zend ACL? Czy ja myślę o ACL w sposób, który będzie dla mnie źródłem problemów?
moje rozwiązanie
Typeonerror dostaje kredyt, ale tutaj jest moje specyficzne rozwiązanie.
ja przedłużony Zend_Acl
uprościć moje zużycie bo tylko załadować roli bieżącego użytkownika:
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);
}
}
aby wypełnić ACL I wykonanie kwerendy, która zwraca resource
, privilege
i role_id
kolumn. Kolumna role_id
ma wartość NULL w zestawie wyników, jeśli rola użytkownika nie ma tego uprawnienia.
$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']);
}
}
Widzę poziomy użytkowników, roli i zasobów w twoim przykładzie. Mam użytkownika, rolę, zasoby, przywilej. Użytkownik ma jedną rolę, rola może mieć wiele zasobów, a zasób może mieć wiele uprawnień. Czy nie rozumiem czegoś w twoim rozwiązaniu? – Sonny
Dźwięki o prawej. Sposób, w jaki użytkownicy są skonfigurowani, każdy użytkownik dziedziczy uprawnienia od rodzica.Tak więc "admin" otrzymuje wszystkie uprawnienia "guest" i "members". Pod adminem zezwalam na "wszystko", a następnie odmawiam akcji "oczyść" wszystkich zasobów i odmawiam akcji "twórz" tylko w przypadku "cms: comments". Dzięki temu mogą uzyskać dostęp do działań "cms: comments-> view" lub "cms: comments-> moderate". – typeoneerror
Dodano kod. – typeoneerror