Ověřování práv vícero uživatelů
- duke
- Člen | 650
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
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
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
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
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.