Zakázání přístupu na stránku bez přihlášení

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

Ahoj, poradil by mi prosím někdo jak znemožním přístup na nějakou stránku bez přihlášení? Myslím tím že když zadám URL dostanu se na stránku i bez přihlášení.

Šaman
Člen | 2666
+
+1
-

Takhle.
Zabezpečené presentery budou dědit od tutoho.
P.S. $userEntity si nevšímej, to je specifická věc pro tenhle projekt.

Editoval Šaman (28. 7. 2014 0:11)

Jan Suchánek
Člen | 404
+
0
-

Taky můžeš zabezpečit BasePresenter a tam kde chceš mít presenter nezabezpečený tak napsat prázdnou metodu.

/**
 * BasePresenter, který pustí dál jen přihlášené uživatele
 */
abstract class BasePresenter extends Nette\Application\UI\Presenter
{

	use TInjectUserRepository;

	/** @var User */
	protected $userEntity;

	public function startup()
	{
		parent::startup();
		$this->checkSecurity()
	}

	public function checkSecurity()
	{
		if (!$this->user->isLoggedIn()) {
			$this->flashMessage("Začněte tím, že se přihlásíte.");
			$this->redirect('Application:login');
		}

		$this->userEntity = $this->userRepository->get($this->user->id);
	}
}

class ExampleUnsecuredPresenter extends BasePresenter
{
	public function checkSecurity()
	{

	}

}

Editoval jenicek (28. 7. 2014 14:10)

Šaman
Člen | 2666
+
0
-

Aby v tom nebyl bordel, podotýkám, že důležitá je metoda startup, která se vykoná na začátku životního cyklu každého presenteru. Dále parent::startup(), aby jsi nepřeskočil nějakou důležitou rutinu popsanou v předkovi. A pak podmínka a redirect, všechno ostatní není důležité. Nepotřebuješ ani repositorty, ani žádnou userEntity, ty jsou tam proto, že jsem ti poslal link na reálný projekt s nějakými odlišnostmi.

Na čistém Sandboxu by to vypadalo takto: (Hlavně pozor, aby SignPresenter nedědil od zabezpečeného, jinak ti vznikne nekonečné přesměrování.)

<?php
public function startup()
{
	parent::startup(); # u startup() psát vždy, stejně jako třeba u konstruktorů

	if (!$this->user->isLoggedIn()) {
		$this->flashMessage("Začněte tím, že se přihlásíte."); # ani tohle není bezpodmínečně nutné
		$this->redirect('Sign:in');
	}
}
?>

Editoval Šaman (28. 7. 2014 16:25)

Felix
Nette Core | 1247
+
+1
-

jenicek napsal(a):

Taky můžeš zabezpečit BasePresenter a tam kde chceš mít presenter nezabezpečený tak napsat prázdnou metodu.

Mozna bych spis doporucoval metodu checkRequirements().

Nemusis to pak hazet do startup.

TomasHuttner
Člen | 66
+
0
-

Šaman napsal(a):

Aby v tom nebyl bordel, podotýkám, že důležitá je metoda startup, která se vykoná na začátku životního cyklu každého presenteru. Dále parent::startup(), aby jsi nepřeskočil nějakou důležitou rutinu popsanou v předkovi. A pak podmínka a redirect, všechno ostatní není důležité. Nepotřebuješ ani repositorty, ani žádnou userEntity, ty jsou tam proto, že jsem ti poslal link na reálný projekt s nějakými odlišnostmi.

Na čistém Sandboxu by to vypadalo takto: (Hlavně pozor, aby SignPresenter nedědil od zabezpečeného, jinak ti vznikne nekonečné přesměrování.)

<?php
public function startup()
{
	parent::startup(); # u startup() psát vždy, stejně jako třeba u konstruktorů

	if (!$this->user->isLoggedIn()) {
		$this->flashMessage("Začněte tím, že se přihlásíte."); # ani tohle není bezpodmínečně nutné
		$this->redirect('Sign:in');
	}
}
?>

Použil jsem tuhle metodu ale když se chci přihlásit hodí mě to zase na stránku s přihlášením..

public function startup()
    {
        parent::startup(); # u startup() psát vždy, stejně jako třeba u konstruktorů

        if (!$this->user->isLoggedIn()) {
            $this->flashMessage("Začněte tím, že se přihlásíte."); # ani tohle není bezpodmínečně nutné
            $this->redirect('Admin:default');
        }
    }

Přihlašování:

public function processLogIn($form)
    {
            $values = $form->getValues();
		$username = $values->name;
		$password = $values->pass;

            $this->userManager->authenticate($username, $password);
            $this->flashMessage('Uživatel přihlášen', 'success');
            $this->redirect('Nastroje:default');
    }
Šaman
Člen | 2666
+
+1
-

Protože špatně přihlašuješ, nevím, kde jsi k tomuto kódu přišel.
Metoda authenticate ti jen vrací identitu, ale fyzicky nikoho nepřihlásí. A volat ji vůbec nemusíš, zavolá si ji $user->login() samo.

TomasHuttner
Člen | 66
+
0
-

super už mi to funguje :)

TomasHuttner
Člen | 66
+
0
-

Ještě bych se chtěl zeptat jak teď zjistím uživatelské jméno přihlášeného uživatele?

takhle zjistím jen id uživatele:

{if ($user->isLoggedIn())}
    <span class="icon-user"></span> {$user->id}
{else}
    <p>Nejste přihlášeni</p>
{/if}
David Matějka
Moderator | 6445
+
0
-
$user->identity->name; //nebo jakkoliv se ten field jmenuje
TomasHuttner
Člen | 66
+
0
-

Díky!