Zakázání přístupu na stránku bez přihlášení
- TomasHuttner
- Člen | 66
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í.
- Jan Suchánek
- Člen | 404
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
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
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
Š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
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
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}