Problém s metodou isAllowed

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

Poradí prosím někdo proč toto nefunguje? Hlásí to chybu „Trying to get property of non-object“

Potřebuji napsat autorizátor, který umožní autorovi smazat či editovat vzkaz…

V šabloně to mám takto:

{foreach $vzkazy->order('datum DESC') as $vzkaz}

      <table class="tabulka">
      <tr><td class="malePismo"></td><td class="vzkaz">{$vzkaz->predmet}<td></tr>
      <tr><td class="malePismo">{$vzkaz->ref('uzivatele', 'uziv_id')->nick}<br/>
      {$vzkaz->datum |date:'%d.%m.%Y'}</td><td class="vzkaz">{$vzkaz->vzkaz}<td></tr>
      <tr> <td n:if="$user->isAllowed([vzkaz, $user->id, $vzkaz], edit)" class="vzkaz"><a n:href="edit $vzkaz->id">EDIT</a></td><td n:if="$user->isAllowed([vzkaz, $user->id, $vzkaz], edit)" class="vzkaz"><a n:href="Homepage:smaz $vzkaz->id">SMAZ</a></td></tr>
      </table>
     {/foreach}

A autorizátor vypadá takto:

<?php
class Authorizator extends Nette\Object
    implements Nette\Security\IAuthorizator
{
    private $database;

	public function __construct(Nette\Database\Connection $database)
	{
		$this->database = $database;
	}


    function isAllowed($role, $resource, $privilege)
    {
      if ($role === 'admin') {
			return TRUE;
		}

      if ($role === 'projektant') {
	if (is_array($resource)) {
		list($type, $userId, $row) = $resource;
			if ($type === 'vzkaz') {
                        **  return $userId === $row->uziv_id ;**
                          //  dump($row->id);




			}

	}
        }
         if ($role === 'host') {
	if (is_array($resource)) {
		list($type, $userId, $row) = $resource;
			if ($type === '') {


			}
	}
        }

		return FALSE;
    }

}
?>

Problém je v tomto řádku u uživatele projektant:

return $userId === $row->uziv_id ;
enumag
Člen | 2118
+
0
-

Doporučuji přečíst mé RFC, uvedený způsob v Nette ještě není, ale jsou tam i odkazy na související témata kde zjistíš jak se to řeší nyní.

Miky0007
Člen | 73
+
0
-

Dyk to ve starších verzích normálně šlo..Ono by bylo asi i nějak líp vymyslet ten autorizátor…Aby tam nemuselo bejt tolik if sekcí…

enumag
Člen | 2118
+
0
-

Šlo, a taky stále jde. Jen to není vůbec hezké (předávat jako $resource pole? WFT?!), proto se to mění.

Ve tvém případě si dumpni $resource a uvidíš…

Miky0007
Člen | 73
+
0
-

Takhle jsme to dáli na školení u Davida…Tak mně to nepřišlo až zas tak špatně…A jak to tedy vyřešit jinak prosím?

enumag
Člen | 2118
+
0
-

To je právě ten problém že bez té nové implementace to o moc líp ani nejde. :-)

Základem je, že to $resource by být objekt implementující rozhraní IResource nebo string, že tam místo toho dáš pole je imho znásilnění (ale chápu že teď lepší možnosti moc nejsou). $type by sis pak vytáhl z toho objektu. $userId se vůbec netýká resource a tedy by určitě nemělo být předáváno tímto způsobem. Proto autorizátor potřebuje celou identitu místo pole rolí, z té si už ID snadno vytáhne. A přesně o tom je celé to RFC.

Editoval enumag (9. 2. 2013 15:08)

Miky0007
Člen | 73
+
0
-

Dumpnul jsem si proměnou resource:

array(3) [
   0 => "vzkaz" (5)
   1 => 7
   2 => 1
]

a taky Privilegia:

"cist" (4)

KDe se v privilegia vezme číst? A jakto, že resource obsahuje jen tyto hodnoty? A néé celý řádek vzkaz…Neví prosím někdo?

enumag
Člen | 2118
+
0
-

Zkusím hádat, nevoláš tu metodu isAllowed v actionEdit, kde ale $vzkaz je parametr a tedy je jenom ID a nikoli entita?

Miky0007
Člen | 73
+
0
-

No volám, ale proč to není celý pole? Ale jen id? Dřív to fungovalo, tak že to předávalo celý pole…

enumag
Člen | 2118
+
0
-

Protože jako parametr se v URL předává jen ID, jak bys tam nacpal objekt? (I to samozřejmě jde, ale pochybuju že to používáš.) Tzn. tohle dříve fungovat nemohlo, respektive uniká ti nějaký podstatný rozdíl mezi tvou starou a aktuální implementací.

Miky0007
Člen | 73
+
0
-

Ok díky moc:-) Už to jede…