Jak dostat do AuthorizatorFactory aktuálně přihlášeného uživatele

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

Čauves,
jsem v lese. Potřeboval bych dostat do AuthorizatorFactory aktuálně přihlášeného uživatele, tak abych tam mohl načíst z DB práva pro aktuálně přihlášeného uživatele a nemusel načítat práva všech uživatelů.

Podobně bych toto využil i v případě, že bych nenačítal z databáze všechny role, jenom ty, které má jenom ten konkrétní uživatel.

Ve factory mám toto:

public function create(){


	    $permission = new Permission;

	    //Basic roles
	    $permission->addRole(self::ROLE_GUEST);
	    $permission->addRole(self::ROLE_USER, self::ROLE_GUEST);
	    $permission->addRole(self::ROLE_ADMINISTRATOR, self::ROLE_USER);
	    //Other roles
	    foreach($this->userManager->getRoles() as $role) $permission->addRole($role);

	    //Basic resources
	    $permission->addResource(self::RES_ADMIN_TOOLS);
		//Other resources
	    foreach($this->authorityManager->getResources() as $resource) $permission->addResource($resource);

	    //Basic privileges
	    $permission->allow(self::ROLE_ADMINISTRATOR, self::RES_ADMIN_TOOLS, Permission::ALL);
		//Other privileges
		//Zde potřebuju zavolat permissionManagera, který mi řekne všechny privileges ke konkrétnímu uživateli
	    return $permission;
      }

v configu v services

authorizatorFactory: App\AuthorizatorFactory
authorizator: @authorizatorFactory::create

Jde to nějak?

Editoval thm (10. 2. 2015 13:14)

Felix
Nette Core | 1199
+
0
-

Muzes si prece dat do konstruktoru User.

enumag
Člen | 2118
+
+1
-

@Felix Nemůže protože tím vytvoří cyklickou závislost.

Editoval enumag (10. 2. 2015 17:30)

Felix
Nette Core | 1199
+
0
-

@enumag Mas pravdu. Nejak me to nedoslo =/

Caine
Člen | 216
+
0
-

Ale tim, ze v construktoru Usera jsou autentizator i autorizator nepovinny, tak by to jit melo, ne?

Zax
Člen | 370
+
+3
-

A co třeba si injektnout IUserStorage a načítat ty informace z něj?

EDIT: samozřejmě identita může existovat i když není user přihlášen, nicméně IUserStorage má metodu isAuthenticated(), takže není vůbec problém si to ověřit a už vůbec není třeba různě ohýbat služby v configu :-D

Editoval Zax (11. 2. 2015 17:23)

David Matějka
Moderator | 6445
+
+3
-

Mohlo by jit:

1. vypnout injectovani Authorizatoru do usera:

services:
	user:
		arguments: [authorizator: null]

2. Nette\Security\User injectnout do AuthorizatorFactory pres konstruktor jako normalni zavislost
3. po vytvoreni permission to nasetovat userovi

$this->user->setAuthorizator($permission);
thm
Člen | 147
+
0
-

Opravdu ne, toto jsem již zkoušel: Circular reference detected for services: user, authorizator, authorizatorFactory.

thm
Člen | 147
+
0
-

Pravda, toto funguje. Po $userStorage->getIdentity(); získám ono potřebné id. Ale identita zůstává zachována i po odhlášení (pokud se nepletu), takže by se to ještě „nějak“ muselo ošetřit, aby se práva nenačítaly i potom.

Editoval thm (11. 2. 2015 8:13)

thm
Člen | 147
+
0
-

Toto řešení funguje. Díky moc @matej21. Díky všem za nápady.

Zax
Člen | 370
+
0
-

$storage->isAuthenticated()?

kalatalabnik
Člen | 35
+
0
-

Identitu můžeš při odhlášení vymastit, pak ti tam nic nezůstane, viz. https://doc.nette.org/…thentication#…

Citace: Při odhlášení se identita nesmaže a je nadále k dispozici. Takže ačkoliv má uživatel identitu, nemusí být přihlášený. Pokud bychom chtěli identitu explicitně smazat, odhlásíme uživatele voláním $user->logout(TRUE).

Editoval kalatalabnik (11. 2. 2015 9:46)

thm
Člen | 147
+
0
-

Tak v tom případě by to šlo. Už jsem to udělal po vzoru @matej21. Identitu určitě smazat takto mohu, ale používám ji pro předvyplňování uživatelského jména do přihlašovacího formuláře. Každopádně díky moc.

Editoval thm (11. 2. 2015 9:55)

Caine
Člen | 216
+
0
-

@matej21 nechces to s tim prepisovani argumentu napsat do dokumentace? Tohle uz jsem parkrat potreboval a zbytecne slozite jsem to musel obchazet..

enumag
Člen | 2118
+
0
-

Na to bacha, při automatickém odhlášení by tam ta identita stále mohla zůstat viset, radši si to ověřuj pomocí isAuthenticated.

Zax
Člen | 370
+
0
-

Nějak nevím, jestli je ten můj druhej příspěvek tak neviditelnej :-D Já radši upravím odpověď, ať je to komplet kdyby to někdo hledal..

ladec
Člen | 5
+
0
-

Mě to teda nejede „Authorizator has not been set.“ :(