vlastní metoda pro autorizaci

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

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

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

Aurielle
Člen | 1281
+
0
-

Asserce byly nahrazeny callbackem. Sám jsem se v tom ještě nevrtal, ale předání jednoduché callback funkce by mělo vyřešit tvůj problém.