Oddělené přihlašování pro běžné uživatele a adminy

dreken
Člen | 36
+
0
-

Ř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.

Kcko
Člen | 465
+
+4
-

Prihlášení uživatele / admina se (v jednom NS = Front/Back) řídí rolí ne? Takže by Ti mělo stačit pouze 1 autentikátor. Kdybys potřeboval další „roli“ tak bys dělal další autentikátor? Snad ne?

Editoval Kcko (2. 11. 2018 9:29)