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