Problém s metodou isAllowed
- Miky0007
- Člen | 73
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
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)