Smazání flashMessage před redirectem?

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

Lze nějakým způsobem smazat flashMessage před redirectem ? Mám napsaných spousty vyjímek a jen v jednom případě při redirectu nechci zobrazovat výpis zpráv vyjímek a flashMessage aniž bych si musel někde noco složitě předávat a prasit kod (jedná se o situaci při přihlášení kdy dám uživateli na zvolený čas ban a nechci pod touto zprávou zobrazovat hlášky typu „User not found, Invalid Password atd:.“)?

LoginPresenter

/**
     * Attempt to login.
     */
    public function renderAuthenticate() {

        // get credentials
        $request = $this->request->getPost();
        $userName = $request["userName"];
        $password = $request["password"];

        try {
            // attempt to login
            $this->getUser()->login($userName, $password);
            // successful login
            $this->redirect("Homepage:default");
        } catch (\Nette\Security\AuthenticationException $e) {
            // invalid login
            // add attempt
            $this->recordAttempt();

            $this->flashMessage($e->getMessage(), "danger");
            $this->redirect("Login:default");
        }
    }


public function renderDefault() {
        $browser = new \BrowserInfo();
        $browser->Browser();
        // Block Internet Exploler 9 and older
        if ($browser->getBrowser() == $browser::BROWSER_IE && $browser->getVersion() <= 9) {
            $this->template->block = TRUE;
        } else {
            $this->template->block = FALSE;
        }
        $this->template->ban = $this->isBanned();
    }

Pokud pokus o přihlášení 3* selhal, je uživatel na nějaký čas banován (session i DB záznam). Pro přihlašování i banování používám @login.latte, kde vždy defaultně vypisuji hlášky.

Editoval Joacim (22. 1. 2016 13:22)

Martk
Člen | 661
+
0
-

Neměl by se o to starat authenticator? V případě banu vyhodit výjimku s jiným textem a ten zobrazit.

Jinak

/** @var Nette\Http\SessionSection */
$session = $this->getFlashSession();
$session->remove();
Joacim
Člen | 229
+
0
-

Antik napsal(a):

Neměl by se o to starat authenticator? V případě banu vyhodit výjimku s jiným textem a ten zobrazit.

Jinak

/** @var Nette\Http\SessionSection */
$session = $this->getFlashSession();
$session->remove();

Já vždy udělám redirect na Login page a až potom se ptám zda mám browser ban nebo login ban, poté mám v default.latte (zde vypisuji FLASH zprávy) pro @login.latte 3 části (přes if, else)

  • login form
  • browser ban message
  • login restricted message

Mohl bych to udělat u tak, že bych měl pro každou zprávu jinej latte file, ale stejně při dalším redirectu by se zpráva vypsala

Mám model SecurityManager (Nette\Security\IAuthenticator), který se volá v LoginPresenteru (renderAuthenticate), a vrací vyjímku nebo objekt uživatele pokud se přihlásí správně

____________________________________

Nakonec jsem to vyřešil takto

<div n:if="count($flashes) > 0" id="flashmessages">
    {if !$ban}
        <div n:foreach="$flashes as $flash"
             class="alert alert-{$flash->type}">{$flash->message}
        </div>
    {/if}
</div>

Editoval Joacim (22. 1. 2016 14:02)

CZechBoY
Člen | 3608
+
0
-

No já bych si udělal novou výjimku UserBannedException, která by nedědila od AuthenticationException (protože ji chytáš a poté zobrazíš flashmessage) a uděláš s potom co potřebuješ.

greeny
Člen | 405
+
0
-

IAuthenticator obsahuje spoustu konstant, tak můžeš jednu z nich použít na zabanovaného uživatele a tam kde odchytíš vyjímku, tak si přes if zjistíš, zdali je to tenhle typ a pokud ano, tak nevyhodíš flashMessage