$user->isAllowed() – může uživatel dělat alespoň jednu věc se zdrojem?

- raketoplan2005
- Člen | 147
Ahoj! V administraci jsem si udělal ověřování práv pomocí anotací a metody checkRequirements. Bohužel jsem si špatně vysvětlil dokumentaci a větu „může uživatel dělat cokoliv se zdrojem?“ v ukázce:
if ($user->isAllowed('file')) { // může uživatel dělat cokoliv se zdrojem 'file'?
useFile();
}
cokoli v tomhle případě totiž znamená všechno, ale já to nevím proč pochopil jako „alespoň něco“.
Podle toho jsem také použil anotaci např.
@RequireResource file s tím že bych chtěl aby k presenteru
mohl přistupovat jen ten, kdo má alespoň nějaké oprávnění ke zdroji
file. Jaké oprávnění to má konkrétně být pak řeším až na
úrovni metod.
Nenapadá vás nějaká alternativa k isAllowed(resource), která by zafungovala tak jak jsem myslel?
Děkuji.

- llook
- Člen | 407
Možná přidat speciální privilege s callbackem, který to zkontroluje
(isAllowed('file', 'alespoň něco')). Cca takhle:
$permission->allow(
IAuthorizator::ALL, IAuthorizator::ALL, 'alespoň něco',
function ($permission) {
foreach (array('view', 'edit', 'delete', 'atd...') as $privilege)
{
if ($permission->isAllowed($permission->getQueriedRole(), $permission->getQueriedResource(), $privilege)) {
return TRUE;
}
}
return FALSE;
}
);
Případně si nějak rozšířit Permission, aby se z něj daly vytáhnout všechny myslitelné privileges a nemusely být explicitně vyjmenovány.

- raketoplan2005
- Člen | 147
Ahoj, děkuji moc, ale můžu tě poprosit ještě o bližší pomoc?
Mám Authorizator, který implementuje
\Nette\Security\IAuthorizator. V něm mám metody, které se
v konstruktoru volají na začátku a které přidají role a zdroje.
Následně jsem manuálně pomocí $this->acl->allow()
nastavil práva k jednotlivým zdrojům.
Za to jsem přidal tento kód s callbackem, kde mi ale
$permission->getQueriedRole() i
$permission->getQueriedResource() vrací prázdné
řetězce.
Editoval raketoplan2005 (20. 1. 2013 17:48)

- raketoplan2005
- Člen | 147
Konečně mi to (snad) doteklo a vyměnil jsem
IAuthorizator::ALL za Permission:ALL.
Takhle to vypadá funkční :-)
$permission->allow(
Permission::ALL, Permission::ALL, 'alespoň něco',
function ($permission) {
foreach (array('view', 'edit', 'delete', 'atd...') as $privilege)
{
if ($permission->isAllowed($permission->getQueriedRole(), $permission->getQueriedResource(), $privilege)) {
return TRUE;
}
}
return FALSE;
}
);
Čili ještě jednou moc děkuji llook!

- raketoplan2005
- Člen | 147
Aktualizace: V Nette 2.1 mi úplně stejný kód vrací vždy
$permission->getQueriedRole() jako NULL čili tento postup už
mi nefunguje.
Edit:
array('view', 'edit', 'delete', 'atd...')
Funguje to vždy jen pro první privilege z tohoto pole.
Edit2:
Vyřešil jsem to takto – vytáhl jsem dotazy na roli a privilege mimo foreach, ta funkce vracela požadovanou roli jen v prvním průchodu. Je to takto správně, prosím?
$this->acl->allow(
Permission::ALL, Permission::ALL, 'neco', function ($permission) {
$queriedRole = $permission->getQueriedRole();
$queriedResource = $permission->getQueriedResource();
foreach (array('add', 'edit', 'delete', 'view') as $privilege) {
if ($permission->isAllowed($queriedRole, $queriedResource, $privilege)) {
return TRUE;
}
}
return FALSE;
}
Editoval raketoplan2005 (17. 2. 2014 12:51)