Přihlašovaní. Nastavení authenticatoru
- Relapse
- Člen | 34
Dobrý den,
prosím vás. V aplikaci která má více modulů, mám v každém modulu
jeden Sign presenter a chtěl bych pro každý modul vlastní authenticator.
Po tomto kódu se mi vždy spustí ten základní authenticator ze sandboxu:
App\model\UserManager.
Dá se nějak nastavit, který authenticator se má spustit, když jich
mám víc?
$user = $this->getUser();
$user->getStorage()->setNamespace('App\ClientModule');
try {
$user->login($values->username, $values->password);
} catch (Nette\Security\AuthenticationException $e) {
$form->addError('Nesprávné jméno nebo heslo.');
}
Děkuji.
Editoval Relapse (23. 6. 2015 13:53)
- David Matějka
- Moderator | 6445
storage namespace nerozhoduje o tom, ktery authenticator se pouzije. Ten NS pouze slouzi k oddeleni vice identit v ramci jedne aplikace. Pokud mas vic authenticatoru, musis to vyresit sam. Nejaka reseni najdes treba tady: https://forum.nette.org/…administrace
- jiri.pudil
- Nette Blogger | 1032
Osobně využívám toho, že do login
metody můžeš vrazit
přímo identitu, čímž se autentikátor úplně obejde. V autentikátorech
pak nemusíš implementovat žádné rozhraní (čímž se vyhneš výjimce
„Multiple services of type IAuthenticator found“ a ta autentikační metoda
zároveň může transparentně vyjmenovat své skutečné parametry),
zaregistruješ si je do kontejneru a vyžádáš si je podle potřeby jako
kteroukoliv jinou službu.
$identity = $passwordAuthenticator->authenticate($username, $password);
// nebo třeba $identity = $tokenAuthenticator->authenticate($token);
$this->user->login($identity);
- Relapse
- Člen | 34
Udělal jsem to podle odkazu od Davida.
SignPresenter:
/**
* @inject
* @var UserManager
*/
public $userManager;
...
$user = $this->getUser();
$user->setAuthenticator($this->userManager);
$user->getStorage()->setNamespace('App\ClientModule');
try {
$this->user->login($values->username, $values->password);
$this->flashMessage('Přihlášení proběhlo úspěšně');
$this->redirect('Homepage:default');
} catch (Nette\Security\AuthenticationException $e) {
$form->addError('Nesprávné jméno nebo heslo.');
}
neon:
services:
- App\Model\UserManager
router: App\RouterFactory::createRouter
UserManager:
class: App\Model\UserManager
autowired: no
BasePresenter:
public function getUser() {
$user = parent::getUser();
$user->getStorage()->setNamespace('App\ClientModule');
return $user;
}
Přihlášení proběhne úspěšně.
Jen ještě, jak můžu s instancí $user pracovat v šablonách?
Musím pokaždé v render metodě provést něco jako:
$this->template->user = $this->getUser();
Protože, když to neudělám, tak mi
{if $user->loggedIn}
vrátí false.
Editoval Relapse (24. 6. 2015 9:43)
- David Matějka
- Moderator | 6445
v base presenteru nastav ten namespace ve startup
metode, pak
nebudes muset prekryvat tu getUser a nic dalsiho posilat do sablony
- jiri.pudil
- Nette Blogger | 1032
@srigi v doplňcích to je kvůli tomu, že to původně doplněk byl, než se @VojtěchDobeš uchýlil k drobné architektonické změně :)