prihlaseni pro backend a frontend zvlast

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

Ahoj, potřeboval bych poradit ohledně přihlašování zvlášť pro administraci a zvlášť pro web. Uživatele pro web a administraci mám v databázi oddělené i s jinými sloupečky. Nevím jestli použít jeden Authenticator nebo dva, ale možná lepší řešení i do budoucna bude použít authenticatory 2 kvůli univerzálnosti a případnému vyhnutí se problémů o kterých ještě nevím :) zatím mám funkční řešení pro administraci (nevím jestli je to nejlepší/aktuální řešení, ale kdysi sem to dělal podle návodu a funguje mi to)

BasePresenter.php

<?php
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
    public function handleSignOut()
    {
        $this->getUser()->logout();
        $this->redirect('Sign:in');
    }
}
?>

SecuredPresenter.php

<?php
abstract class SecuredPresenter extends BasePresenter
{
    protected function startup()
    {
        parent::startup();

        if (!$this->getUser()->isLoggedIn()) {
             $this->redirect('Sign:in');
        }
    }
}
?>

AdminPresenter.php

<?php
class AdminPresenter extends SecuredPresenter {...}
?>

SignPresenter.php

<?php
use Nette\Application\UI, Nette\Security as NS;

class SignPresenter extends BasePresenter
{ ...
       public function signInFormSubmitted($form)
	{ ... $this->getUser()->login($values->username, $values->password); ... }
... }
?>

config.neon
`
services:
authenticator: Authenticator(@connection)
`

Authenticator.php

<?php
use Nette\Security as NS;

class Authenticator extends Nette\Object implements NS\IAuthenticator
{ ...
	public function authenticate(array $credentials)
	{ ... return new NS\Identity($row->id, NULL, $row->toArray()); }
... }
?>

------------ To byl můj aktuální stav a potuď mi přihlašování do administrace funguje -------------

pokusil jsem se tedy postupovat podobným postupem pro přihlašování na web a vytvořil jsem

BasePresenter.php
zůstal stejný, akorát pak do něho na konci kdyžtak přidám odhlašování

SecuredFrontPresenter
vymazal jsem redirect na přihlašovací form, protože frontend mi mohou procházet i nepřihlášení uživatelé

<?php
abstract class SecuredFrontPresenter extends BasePresenter
{
    protected function startup()
    {
        parent::startup();
    }
}
?>

HomepagePresenter.php
Presenter, ke kterému bych chtěl přidat možnost k přihlašování, proto jsem změnil rozšíření

<?php
class HomepagePresenter extends SecuredFrontPresenter {...}
?>

config.neon
tady pokuď přidám
`
services:
authenticator: Authenticator(@connection)
authenticatorFront: AuthenticatorFront(@connection)
`
?>
tak mi to hodí chybu duplicitní služby
`
Multiple services of type Nette\Security\IAuthenticator found.
`
proto jsem tuto změnu zatím zakomentoval.

AuthenticatorFront.php

<?php
use Nette\Security as NS;

class AuthenticatorFront extends Nette\Object implements NS\IAuthenticator
{ ...
	public function authenticate(array $credentials)
	{ ... return new NS\Identity($row->id, NULL, $row->toArray()); }
... }
?>

problém teď nastane takový, že pokuď se snažím přihlásit z HomepagePresenter.php tak se mi zavolá původní Authenticator.php, který vrátí špatné přihlašovací údaje.

Jak mohu svůj kód upravit aby to fungovalo a je takové řešení správné ? Děkuji :)

Editoval muflix (18. 10. 2012 19:07)

Felix
Nette Core | 1198
+
0
-

Co takhle mit jeden authenticator a udelat si dve tovarnicky na nej, ktere ti budou menit treba tabulku? Od toho tu tovarnicky prece jsou :)

muflix
Člen | 92
+
0
-

Felix: aha no, to by asi bylo jednodušší, akorát bych do toho musel přidělat role což je jen druhý parametr

<?php
return new NS\Identity($row->id, NULL, $row->toArray());
?>

jestli to chápu dobře :) tak to vyzkoušim ještě, ikdyž asi né hned.

jinak sem ještě zkoušel upravit to moje podle
https://forum.nette.org/…-funkcni-ale#…
a už se mi daří se přihlásit přes ten druhý authenticator, ale nevím jak si vypsat údaje o uživately, protože

<?php
$user->getIdentity()->login
?>

mi píše
‚Notice : Trying to get property of non-object‘ tak nevím, jestli musím někde definovat ještě jakej auth použít :P:) ale jinak moc díky, zkusím vytvořit authenticate2(…) kde změnim db tabulku a přiřadim jinou roli.

Editoval muflix (18. 10. 2012 20:22)