isAllowed – „Odkud právo pochází“

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
MartyIX
Člen | 217
+
0
-

Použil jsem https://doc.nette.org/…oli-a-zdroju a nyní si k tomu vytvářím jednoduchou správu. Narazil jsem však na problém, že nevím, od koho, od jaké role, právo pochází. Problémem je, že přístup ke zdroji může pocházet od nějakého z rodičů.

$acl->isAllowed($role, $resource, $privilege)

Nyní bych to řešil zřejmě tak, že bych procházel od dané role po rodičích výše a právo hledal, což je dost nešikovné, protože věřím, že tato informace bude nějak dostupná rovnou, když jsou všechna práva v cache.

Díky za odpověď

EDIT: Je otázka srozumitelná? Nebo jen nikdo nezná odpověď?

Editoval MartyIX (10. 3. 2010 0:04)

MartyIX
Člen | 217
+
0
-

Pokus o řešení, jde o jednu metodu přidanou k třídě zde: https://doc.nette.org/…oli-a-zdroju.

V souboru security/permissions.php jsem nenalezl žádnou metodu, která by výrazně pomohla v řešení, tak používám prohledávání do hloubky pro rodiče dané role, které lze zjistit pomocí metody getRoleParents.

/**
* Access control list
*/
class Acl extends Permission {

    /**
    * Returns the "oldest" ancestor(s) in @role's genealogy that has/have the permission for @resource and @privilege
    * @uses Let the parameter @oldest set to zero!
    *
    * @param string|array $role
    * @param string|array $resource
    * @param mixed $privilege
    * @param int $oldes
    *
    * @return array
    */
    public function allowedByRole($role = self::ALL, $resource = self::ALL, $privilege = self::ALL, $oldest = 0) {

       # Assume that @role doesn't have the permission for @resource and @privilege
       $result = array(
         "oldest" => $oldest,
         "role" => array()
       );

       if ($role != self::ALL) {
         if ($this->isAllowed($role, $resource, $privilege)) {
           # Set @role as result and improve gradually
           $result = array(
             "oldest" => $oldest,
             "role" => array($role)
           );
           $parents = $this->getRoleParents($role);

           if (count($parents)) {
             foreach ($parents as $parent) {
               $value = $this->allowedByRole($parent, $resource, $privilege, $oldest + 1);

               if ($value['oldest'] > $oldest && count($value['role'])) {
                 $result = $value;
               } elseif ($value['oldest'] == $oldest && count($value['role'])) {
                 $result['role'] += $value['role'];
               }
             }
           }
         }
       }

       if ($oldest == 0) {
         return $result['role']; # final result
       } else {
         return $result; # result during recursion
       }
    }
}
Ondřej Mirtes
Člen | 1536
+
0
-

K čemu něco takového potřebuješ? :)

MartyIX
Člen | 217
+
0
-

Dělám si správu práv – formulář s checkboxy, kde se nastavují práva pro jednu roli. Nemohu odškrtávat checkboxy, které jsou zaškrtlé proto, že právo je poděděné.

S funkcí výše mohu udělat to, že checkbox bude mít vlastnost disabled a napíšu za něj informaci od jaké role je právo poděděné.

Jak to řeší ostatní?

Ondřej Mirtes
Člen | 1536
+
0
-

Jo, tak s tímhle si také lámu hlavu a nevím, jak to vyřeším :)

Možná by to za tímhle účelem chtělo jiný způsob uložení těchto informací v DB, kde by se to dalo snadněji spravovat.

MartyIX
Člen | 217
+
0
-

Z čehož plyne, že tě mé řešení nezaujalo :-) což docela chápu, kdybys na něco přišel, tak rád se přiučím.