vlastní metoda pro autorizaci
- spidy
- Člen | 55
Ahoj, právě programuju webovou aplikaci v Nette a narazil jsem na problém při autorizaci. Každý uživatel si v té aplikaci zadává určitá data a potom může zvolit další uživatele, kteří budou mít k těm datům přístup. Který uživatel si může zobrazit která data mám uloženo v databázi.
Mohl bych to samožejmě řešit metodou v modelu, ale přišlo by mi hezčí, kdyby se dalo napsat něco jako
if($user->isAllowed($id, 'viewData')) {
...
}
a nějakým způsobem „přetížit“ metodu isAllowed.
Četl jsem tento návod, podle ktrého by to mělo jít udělat. Je ale celkem starý a v Nette od té doby nejspíš došlo k pár změnám (např. rozhraní IPermissionAssertion jsem nebyl schopný nikde najít). Proto prosím někoho zkušenějšího, jestli by mi nemohl popsat (nebo poslat link na nějaký příklad), jak by se něco takového dalo udělat v současné verzi Nette.
Děkuji, Spidy
- spidy
- Člen | 55
Tak jsem nakonec zkusil vytvořit novou třídu, která dědí Nette\Web\User a přidal jí svou vlastní metodu a funguje to :). Budu to tedy používat nějak takhle:
MyUser.php:
<?php
class MyUser extends Nette\Web\User
{
public function canViewData($user_id) {
$count = dibi::query('SELECT 1
FROM permissions
WHERE user_id = %i', $user_id,
'AND visitor_id = %i', $this->getId()
)->getRowCount();
return $count > 0;
}
}
config.neon:
common:
service:
Nette\Web\IUser: MyUser
a v presenteru potom:
if($user->canViewData($id) {
...
}
Co na to říkáte? Já když nad tím přemýšlím, tak mi to ani nepřipadá jako nějaká šílená prasárna :o).