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

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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)