Oddělené přihlašování pro běžné uživatele a adminy
- dreken
- Člen | 36
Řeším takový zapeklitý problém, a to přihlašování běžných uživatelů a adminů, které probíhá na odlišných authenticatorech. To by samo o sobě nebylo takový problém, už vím, že je to popsáno v dokumentaci.
Problém je v tom, že (co jsem aspoň pochopil) v dokumentaci se počítá s tím, že moduly pro frontend a pro admin jsou oddělené, tzn. v jednom presenteru (resp. view) se pracuje pouze s jedním typem uživatele a nastaví se podle toho namespace. Já to tak nechci, potřebuji v každém view mít 2 nezávislé přihlášení běžného uživatele a admina. Důvod je takový, že třeba v komentářích můžu vystupovat jako běžný user, ale u článku se mi zobrazí editační panel, který je k dispozici jen pro adminy. Předvedu tedy v kódu, o co jsem se neúspěšně pokoušel:
V config.neon je to zapsáno takto:
frontAuthenticator:
create: App\Model\Security\UserAuthenticator
autowired: self
adminAuthenticator:
create: App\Model\Security\AdminAuthenticator
autowired: self
A v BasePresenter:
class BasePresenter
{
...
/**
* @inject
* @var \Nette\Security\User
*/
public $admin;
/**
* @inject
* @var \Nette\Security\User
*/
public $user;
public function checkRequirements($element)
{
// Oddelene prihlaseni pro admina a pro plebs
$frontAuthenticator = Globals::getService(UserAuthenticator::class); // Za toto me asi ukamenujete, tato staticka metoda je muj vynalez pro zjednoduseni DI
$this->user->getStorage()->setNamespace('user');
$this->user->setAuthenticator($frontAuthenticator);
$adminAuthenticator = Globals::getService(AdminAuthenticator::class);
$this->admin->getStorage()->setNamespace('admin');
$this->admin->setAuthenticator($adminAuthenticator);
parent::checkRequirements($element);
}
protected function checkUserLoggedIn()
{
return $this->user->isLoggedIn();
}
protected function checkAdminLoggedIn()
{
return $this->admin->isLoggedIn();
}
...
}
Již po prvních 2 injectech je vidět, že je to blbost, protože v
$user
i $admin
je uložena ta samá instance
\Nette\Security\User
. Otázka, jak toho docílit, protože do
config.neon už nemůžu zadefinovat další službu s třídou
\Nette\Security\User
.