ACL: Jak dostat Nette\Security\User do AuthorizatorFactory
- Siki
- Člen | 9
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 | 2658
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
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)