isAllowed – „Odkud právo pochází“
- MartyIX
- Člen | 217
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
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
}
}
}
- MartyIX
- Člen | 217
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
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.