ACL: Jak dostat Nette\Security\User do AuthorizatorFactory

Siki
Člen | 9
+
0
-

Ahoj, prosím o pomoc. Již delší dobu zkouším dostat Nette\Security\User do AuthorizatorFactory. Zdroje a oprávnění se mají načíst z databáze podle přihlášeného uživatele.

<?php
namespace App\Model;

class AuthorizatorFactory
{
	...

	public function __construct(OpravneniRepository $opravneniRepository)
	{
		$this->opravneniRepository = $opravneniRepository;
	}

    public function create(): Nette\Security\Permission
    {
        $acl = new Nette\Security\Permission;
		$acl->addRole('admin');

		// zde by mělo být načtení oprávnění z DB podle přihlášeného uživatele
		$opravnení = $this->opravneniRepository->findAll()->where(['uzivatel_id' => $uzivatelId])
		...
	}
}
?>

v config.neon

services:
	authorizatorFactory: App\Model\AuthorizatorFactory
	authorizator: @authorizatorFactory::create()

Když do konstruktoru AuthorizatorFactory předám \Nette\Security\User, tak dostanu chybu:

Circular reference detected for services

Jak tedy do AuthorizatorFactory předat objekt User?

Jak případně řešíte vy načítání ACL z databáze pro přihlášeného uživatele?

Díky za pomoc.

Šaman
Člen | 2666
+
+3
-

Nepředávej Usera do Authorizáotoru. Protože se Authorizátor předává implicitně do Usera (aby bylo možné zavolat třeba $user->isAllowed('article', 'write');)

Zdroje a oprávnění načti univerzálně pro všechny a přihlášený uživatel pak má jen svoje, podle jeho role.

Editoval Šaman (18. 10. 2019 17:07)

Siki
Člen | 9
+
-2
-

Díky za řešení. Jen se mi zdá zbytečné načítat třeba 500 pravidel kvůli jednomu uživateli, který jich má třeba jen 10.

Nakonec mě napadlo předat do konstruktoru IUserStorage, takže se dostanu k uložené identitě.

Zde je kód:

<?php
namespace App\Model;

class AuthorizatorFactory
{
    ...

    public function __construct(
		OpravneniRepository $opravneniRepository,
		IUserStorage $storage
	)
    {
        $this->opravneniRepository = $opravneniRepository;
		$this->identita = $storage->getIdentity();
    }

    public function create(): Nette\Security\Permission
    {
        $acl = new Nette\Security\Permission;
        $acl->addRole('admin');

        // načtení oprávnění z DB podle přihlášeného uživatele
        $opravneni = $this->opravneniRepository->findAll()->where(['uzivatel_id' => $this->identita->id])
		//nebo
		$opravneni = $this->opravneniRepository->findAll()->where(['role' => $this->identita->getRoles()])
        ...
    }
}
?>

Editoval Siki (19. 10. 2019 18:50)

Siki
Člen | 9
+
0
-

Prosím o vysvětlení, proč je to špatně.