Nette 2.1 ACL – jak nastavit authorizator

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

Zdravim.

Do presenteru jsem si umístil tento kód:

public function actionDefault()
{
    $acl = new Nette\Security\Permission;

    // definujeme role
    $acl->addRole('guest');
    $acl->addRole('registered', 'guest'); // registered dědí od guest
    $acl->addRole('administrator', 'registered'); // a od něj dědí administrator

    //zdroje
    $acl->addResource('league');

    // nechť guest může prohlížet ligy
    $acl->allow('guest', 'league', 'view');

    // registrovaný muze editovat ligy
    $acl->allow('registered', 'league', 'edit');

    // administrátor může prohlížet a editovat cokoliv
    $acl->allow('administrator', Nette\Security\Permission::ALL, array('view', 'edit'));

    dump( $acl->isAllowed( 'registered', 'league', 'edit' ) );
}

To mi funguje :-) S načtením stránky se mi vydumpuje TRUE

Ale jak na to v latte?
Pokud jsem admin, chci mít možnost příspěvek editovat: default.latte:

{if $user->isAllowed("league", "edit")}
   <a href="">mám právo editovat lidu</a>
{/if}

ovšem Nette končí chybou:
Nette\InvalidStateException
Authorizator has not been set.

Jak nastavit authorizator? Děkuji za rady a nápady

motorcb
Člen | 552
+
0
-

@vvoody:
Díky, to je přesně ono. Funguje. Máš u mne pivo.

Jak se řeší přístup pokud má uživatel více rolí? Napžíklad má role admin, developer.

Pole rolí předhodit nemohu :-(

dump( $acl->isAllowed( array( 'admin', 'developer' ), 'league', 'edit' ) );

Jak na to?

Michal Vyšinský
Člen | 608
+
0
-

Pokud se nepletu, tak se isAllowed volá přímo na objekt uživatele, takže role tam vkládat nepotřebuješ. Zadáš jen resource a privilege a Nette se ti o to už postará.