Jak rozlišit přihlášeného uživatele?

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

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

xciza
Člen | 194
+
0
-

Díky. Kde nejlépe to nastavovat? Ve startup metodě Sign presenteru?

David Matějka
Moderator | 6445
+
+1
-

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
+
0
-

Super, díky, vyzkouším.

xciza
Člen | 194
+
+1
-

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
+
0
-

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.

xciza
Člen | 194
+
0
-

Nikdo by prosím nevěděl?

James_Scott
Člen | 55
+
0
-

Tak se podívej (dumpni si), co obsahuje promenna $user. Tohle by melo normalne jit..

Šaman
Člen | 2666
+
0
-

Mimochodem, tohle by tam mělo pustit i frontend usera, pokud je přihlášen. Chyba bude jinde.
Tohle se dělá pomocí rolí.

Editoval Šaman (16. 11. 2014 18:36)

xciza
Člen | 194
+
0
-

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?

xciza
Člen | 194
+
0
-

Projekt jsem hodil na git. Tak snad to pomůže k vyřešení mého problému. Předem díky za rady.

Šaman
Člen | 2666
+
0
-

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)

xciza
Člen | 194
+
0
-

SignPresenter momentalne nededi schvalne protoze jinak se to zacikli. Byl bych rád za radu jak toto napravit? Rad bych ponechal ty namespaces na usery.

Šaman
Člen | 2666
+
0
-

No tak to zkus buď nastavit i v SignPresenteru, nebo budeš budes použít složitější strukturu – třeba přidat SecuredPresenter, který bude řešit ten přístup a AdminBasePresenter jen nastaví session a pak od něho může dědit i SignPresenter.

kudlajz
Člen | 70
+
0
-

Treba:

if (!$user->isLoggedIn() && $this->name != "Admin:Sign") {
            $this->redirect(':Admin:Sign:in');
        }

?

xciza
Člen | 194
+
0
-

Tak nakonec pomohlo to nastavit jeste ve startup metode SignPresenteru.