Jak rozlišit přihlášeného uživatele?
- xciza
- Člen | 194
Ahoj,
pokouším se o aplikaci, kde bych chtěl mít vlastní authentikátor pro
backend a frontend. To se mě tak nějak podařilo pomocí dvou modelů a
rozlišení tabulek. Jenže když se přihlásím do administrace a potom
přejdu na frontend, jsem přihlášený a tam, kde v kódu mám podmínky
{if $user->loggedIn}
je samozřejmě vše funkční, protože běží sezení toho admin usera. Jak udělat aby mě to ty admin usery na frontu nebralo, a obráceně front usery nebralo na backendu?
Díky
- David Matějka
- Moderator | 6445
v sign presenteru to nestaci – dalsi presentery museji vedet, ktery namespace pouzit. Takze to nastav v base presenterech pro backend a frontend. A ano, ve startup, pripadne v checkRequirements (to se vola jednou jeste pred startup)
- xciza
- Člen | 194
Tak jsem startup metody BasePresenterů upravil takto:
protected function startup() {
parent::startup();
$this->user->getStorage()->setNamespace('admin'); //respektive ('front')
}
ale když se přihlásím na frontendu tak se stejně dostanu do administrace. A když se na frontendu odhlásím pomocí
public function actionOut() {
$this->getUser()->logout();
$this->flashMessage('Ohlášení proběhlo úspěšně.', 'info');
$this->redirect(':Front:Homepage:default');
}
tak se odhlášení neprovede a v debugbaru stále vidím přihlášeného usera. Co dělám prosím špatně? Kdyby bylo potřeba více kódu tak prosím napište co konktrétně potřebujete vidět.
Díky
EDIT: Tak problém vyřešen. Já blb v SignPresenterech extendoval starý BasePresentery.
EDIT2: Tak jsem to kloudně vyzkoušel a stejně se s přihlášeným uživatelem z frontu dostanu na beckend. Musím tam ještě kontrolovat jaky uživatel je přihlášený?
Editoval xciza (14. 11. 2014 17:55)
- xciza
- Člen | 194
Tak jsem si startup metodu v admin BasePresenteru rozsiril o kontrolu prihlaseneho uzivatele:
if (!$user->isLoggedIn()) {
$this->redirect(':Admin:Sign:in');
}
ale i kdyz je admin uzivatel prihlasen tak pri pokusu o prechod na jinou stranku administrace me to stejne presmeruje na Sign formulář. Co by to mohlo zapříčinit? Frontend usera uz to tam nepusti spravne.
- James_Scott
- Člen | 55
Tak se podívej (dumpni si), co obsahuje promenna $user. Tohle by melo normalne jit..
- xciza
- Člen | 194
Však ja identitu uživatele vidim i v debugbaru pod modrým panáčkem – user: admin, role: admin… Přihlašovací formulář mě normálně vypíše flashMessage o úspěšném přihlášení, ale nepřesměruje to tam kam má – respektive startup metoda Basepresenteru mě přesměruje zpět na login:
//BasePresenter
public function startup() {
parent::startup();
// nastaveni oddeleneho prihlasovani
$user = $this->getUser();
$user->getStorage()->setNamespace('admin');
// kontrola prihlaseni
if (!$user->isLoggedIn()) {
$this->redirect(':Admin:Sign:in');
}
}
//login form
public function signInFormSucceded($form) {
$values = $form->getValues();
if ($form->isSuccess()) {
try {
$this->adminUserManager->login($values->username, $values->password);
$this->flashMessage('You have been successfully loged in.', 'info');
$this->redirect(':Admin:Default:default');
} catch (Nette\Security\AuthenticationException $e) {
$this->getPresenter()->flashMessage($e->getMessage(), "error");
}
}
}
A když si dam dump
var_dump($user->getIdentity());
tak identita je taky naplněná:
object(Nette\Security\Identity)#31 (3) { ["id":"Nette\Security\Identity":private]=> int(1) ["roles":"Nette\Security\Identity":private]=> array(1) { [0]=> string(5) "admin" } ["data":"Nette\Security\Identity":private]=> array(3) { ["id"]=> int(1) ["username"]=> string(5) "admin" ["role"]=> string(5) "admin" } }
Šaman napsal(a):
Mimochodem, tohle by tam mělo pustit i frontend usera, pokud je přihlášen. Chyba bude jinde.
Tohle se dělá pomocí rolí.
I když mám nastavené namespaces pro usery a oddělené tabulky?
- Šaman
- Člen | 2666
Takhle použité session namespace jsem ještě neviděl. Ale máš tam určitě chybu v tom, že Admin:SignPresenter nedědí od tvého BasePresenteru (to teď ani nejde, jinak by se nepřihlášený nemohl ani přihlásit), takže při vytvoření identity (zápisu do session) nemáš vybrané namespace.
Ale tohle celé by mohlo mít jedinou výhodu – na jednom počítači
přihlášeného jiného uživatele do frontendu a jiného do backendu. Jestli
to není to, co potřebuješ, tak prostě uživatelovi nastav roli a při
přechodu na admina kontroluj, že $user->role === 'admin';
a
o žádné session namespace se nestarej.
Editoval Šaman (17. 11. 2014 16:56)