Smazání flashMessage před redirectem?
- Joacim
- Člen | 229
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)
- Joacim
- Člen | 229
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)
- greeny
- Člen | 405
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