problém se zaregistrováním autorizátoru a použitím v layout.latte

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

Zdravím, mám problém se zaregistrováním autorizátoru pro přihlášeného uživatele. Pokud po nastavení autorizátoru použiju v presenteru metodu $this->getUser()->isAllowed(‚objednavka‘,‚zobrazit‘) ⇒ vrátí správně true (podle nastavených práv). Pokud ale použiju stejnou metodu, tedy $user->isAllowed(‚objednavka‘, ‚zobrazit‘), v layout.latte, tracy vyhodí chybu „Authorizator has not been set.

Kód vypadá zhruba takto:

Autentizace (ta proběhne bez problémů) a autorizace probíhá v SignPresenter:

<?php
...
class SignPresenter extends BasePresenter
{

    protected $authorizationManager;


    public function startup() {
        parent::startup();

        $this->authorizationManager = $this->context->getService('AuthorizationManager');
    }

	...

	public function signInFormSucceeded($form, $values)
	{
		if ($values->zapamatovat) {
			$this->getUser()->setExpiration('14 days', FALSE);
		} else {
			$this->getUser()->setExpiration('20 minutes', TRUE);
		}

		try {
			$this->getUser()->login($values->login, $values->heslo);

                        $acl = $this->authorizationManager->getPermission();

                        $this->getUser()->setAuthorizator($acl);
                        if($this->getUser()->isAllowed("objednavka","zobrazit")){
			    //tohle je pouze testování návratové hodnoty - mám problém s rozchozením debbugeru
                            $this->redirect(':Order:Order:default');
                        }else{
			//tohle je pouze testování návratové hodnoty - mám problém s rozchozením debbugeru
			$this->redirect('Homepage:');
                        }

		} catch (Nette\Security\AuthenticationException $e) {
			$form->addError($e->getMessage());
		}
	}

}
?>

Práva se berou z třídy AuthorizationManager, která je registrovaná jako služba v config.neon:

<?php
class AuthorizationManager extends \Nette\Object {

    /** @var Nette\Database\Context */
    private $database;
    private $acl;


    public function __construct(Nette\Database\Context $database) {

        $this->database = $database;

        $this->acl = new Nette\Security\Permission;

    }


    public function getPermission(){
	//testovací práva
        $this->acl->addRole("admin");
        $this->acl->addResource("objednavka");
        $this->acl->addResource("uzivatel");
        $this->acl->allow("admin", "objednavka", "zobrazit");
        $this->acl->deny("admin", "uzivatel", "zobrazit");

        return $this->acl;
    }


}
?>

V config.neon:

services:
	- App\Model\UserManager
	- App\RouterFactory
	BaseModel: App\Model\BaseModel
	AuthorizationManager: App\Model\AuthorizationManager
	router: @App\RouterFactory::createRouter

Chyba nastává v layout.latte po přihlášení:

{if $user->isAllowed('objednavka', 'zobrazit')}
    Objednavka
{/if}

Předpokládal jsem, že stránka by se měla vykreslit až po proběhnutí metody signInFormSucceeded v SignPresenteru ⇒ i po nastavení autorizátoru pomocí metody setAuthorizator()… nevím jestli je chyba v tomto nebo s předáním objektu Nette\Security\Permission do „globální“ proměnné $user, nebo ještě někde jinde.
V nette jsem začátečník, takže budu rád za každou radu a poučení! :-)

David Matějka
Moderator | 6445
+
0
-

registruj autorizator vytvoreny tim authorization managerem jako sluzbu, do neonu pridej:

services:
	-
		class: Nette\Security\IAuhtorizator
		create: @AuthorizationManager::getPermission

tim se autorizator automaticky sparuje s userem, takze muzes smazat

$this->getUser()->setAuthorizator($acl);

a souvisejici radky

luban
Člen | 3
+
0
-

Práva ale nebudou vždy statická, jak je v příkladu. Budu je tahat z databáze a budou se moct lišit uživatel od uživatele.

Jednodušeji, budu potřebovat do AuthorizationManager předávat id přihlášeného uživatele a podle toho nastavovat práva pomocí metod Nette\Security\Permission.

To tímhle způsobem asi nedokážu… nebo jestli jsem to špatně pochopil, tak mi to prosím zkus vysvětlit víc polopatě. (Hold se začátečníkama je to těžký :-) )

Díky

luban
Člen | 3
+
0
-

Zkusil jsem zaregistrovat autorizátor v tom config.neon, ale stejně to nefunguje. Teď se vyhodí chyba Role ‚admin‘ does not exist při získání práv přes metodu isAllowed hned v presenteru.

Protože tomu configu moc nerozumím, zkusím se zeptat:

  1. jak se sparuje autorizator s userem?
  2. kde se předá useru instance třídy Nette\Security\Permission() z funkce getPermission (tady je definovaná role admin)
  3. ještě k předchozímu dotazu – proč se funkcí setAuthorizator() nenastaví instance Nette\Security\Permission() napořád? Vždyť z presenteru přes $this->user a v latte přes $user přistupuju k jedné a té samé proměnné ne?

Kdyby mi ještě někdo mohl jednoduše popsat, jak jednoduše rozchodit acl, byl bych vděčný, už jsem se v tom totálně ztratil a ani nikde na foru nemůžu najít nic co by mi pomohlo…

Editoval luban (7. 10. 2014 15:42)

jarekp
Člen | 2
+
0
-

luban napsal(a):

Zkusil jsem zaregistrovat autorizátor v tom config.neon, ale stejně to nefunguje. Teď se vyhodí chyba Role ‚admin‘ does not exist při získání práv přes metodu isAllowed hned v presenteru.

Protože tomu configu moc nerozumím, zkusím se zeptat:

  1. jak se sparuje autorizator s userem?
  2. kde se předá useru instance třídy Nette\Security\Permission() z funkce getPermission (tady je definovaná role admin)
  3. ještě k předchozímu dotazu – proč se funkcí setAuthorizator() nenastaví instance Nette\Security\Permission() napořád? Vždyť z presenteru přes $this->user a v latte přes $user přistupuju k jedné a té samé proměnné ne?

Kdyby mi ještě někdo mohl jednoduše popsat, jak jednoduše rozchodit acl, byl bych vděčný, už jsem se v tom totálně ztratil a ani nikde na foru nemůžu najít nic co by mi pomohlo…

Našel jsi nějaké řešení? Případně nevěděl by někdo, co s tím? Mám totiž podobný problém.

Jan Mikeš
Člen | 771
+
0
-

Vzdyt tam je jasne napsano co je za chybu.
Nemas definovanou roli „admin“ ve sve instanci Nette\Security\Permission a zaroven se nekde dotazujes zdali ma uzivatel danou roli.

V tride Nette\Security\Permission si nejdrive musis nadefinovat veskere role a resources, az pak s nimi muzes pracovat