Ověřování práv vícero uživatelů

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

Chtěl bych se zeptat, jaká je best practice, když potřebuju ověřovat práva více uživatelů v rámci jednoho requestu. Příklad použití je, že přihlášený uživatel iniciuje operaci, která se týká jiného uživatele, ale tato operace vyžaduje, aby oba měli určitá práva. Jak tedy nejlépe ověřit práva toho druhého uživatele?

llook
Člen | 407
+
0
-

Jako ACL pravidlo je možné uvést callback/closure. V dokumentaci se o tom zatím nepíše, ale používá se to takto:

$acl->allow($role, $resource, $privilege, function ($permission, $role, $resource, $privilege) {
	if (nějaká_rozhodovací_logika()) {
		return true; // Uživatel má oprávnění
	} else {
		return false; // Uživatel má kulový
	}
});

Dále jako $role a $resource lze podsouvat objekty implementující Nette\Security\IRole, resp. Nette\Security\IResource. Tímto způsobem lze předat například uživatele a objekt, ke kterému chce získat oprávnění, viz https://forum.nette.org/…i-permission#…

duke
Člen | 650
+
0
-

Zajímavé, nicméně se obávám, že odpovídáš na něco jiného, než se ptám.

V podstatě mi jde o to, že chci udělat něco takovéhoto:

if ($user1->isAllowed($resource, 'foo') && $user2->isAllowed($resource, 'bar')) {
  doFooBarOperation($user1, $user2);
}

Přitom $user1 získám ze systémového kontejneru (resp. z presenteru). Jak mám ale nejlépe vytvořit $user2?
Tuším, že budu muset nejdřív vytvořit zvláštní UserStorage s jiným namespacem, než má user1, nebo si napsat svoje vlastní (nepotřebuji pro user2 využívat session). Ale třeba jsem přehlédl jednodušší způsob, jak toto řešit.

Aleš
Člen | 30
+
0
-

Oklikou přes svůj problém (jak dostat ID aktuálního přihlášeného uživatele do Permission) jsem možná přišel na řešení tvého problému. Metoda User::isAllowed je v podstatě jenom cukrátko nad získáním Permission (či jiného autorizátoru) a volání foreach nad všema rolema který přísluší danýmu userovi. Pokud si rozšíříš svůj autorizátor o podobnou metodu, můžeš ho pak přímo použít.

<?php
$autorizathor = ... //vatvoření/vytáhnutí autorizátoru nejlíp z DI kontejneru

if ($autorizathor->check($user1,$resource, 'foo') && $autorizathor->check($user2,$resource, 'bar')) {
  doFooBarOperation($user1, $user2);
}
?>

jenom nápad

duke
Člen | 650
+
0
-

Je mi jasné, že si to můžu takto zkontrolovat sám a úplně se obejít bez třídy Nette\Security\User, ale má otázka byla ohledně best practice. Když máme v Nette třídu Nette\Security\User, která je zodpovědná za autentizaci a autorizaci uživatelů, tak proč řešit autorizaci uživatelů jinak?

Zatím vidím jako nejlepší tu vlastní UserStorage. Otázka je, jestli by neměla být nějaká taková user storage přímo součástí frameworku. K tomu, abych mohl ověřit práva nějakého uživatele (z jakéhokoli důvodu) přece nutně nepotřebuji startovat session…

Ale přesto, díky za reakci.