$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)