NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Nette\Security\AuthenticationException() výjimka a url odkaz

Aktivity
Avatar
visekdo
Člen
Avatar
visekdo:18.8.2015 16:45

Zdravim lidi,
je nějaká možnost jak vložit url odkaz směřovací jinam do vypisování chyby v této výjimce Nette\Security\Au­thenticationEx­ception()? V nette je to totiž ošetřený protí speciálním znakům a když ho tam pouze napíšu ve stylu

<a href=''>odkaz</a>

, tak mi to nevyhodí odkaz ale tento text to vypíše.

Editováno 18.8.2015 16:48
 
Odpovědět
18.8.2015 16:45
Avatar
d4rkw34v3r
Tvůrce
Avatar
Odpovídá na visekdo
d4rkw34v3r:18.8.2015 16:52

Proč to psát do zprávy vyjímky? Navíc, je to runtime vyjímka a chyba už je poznat z názvu vyjímky, takže tam nepotřebuješ psát žádnou zprávu. Tu vyjímku si odchyť a zprávu napiš do Flash Message

 
Nahoru Odpovědět
18.8.2015 16:52
Avatar
d4rkw34v3r
Tvůrce
Avatar
Odpovídá na visekdo
d4rkw34v3r:18.8.2015 17:18

Jinak ten text s odkazem do flash message dostanes tak, ze si vytvoris Html element a ten pak jenom predas ty flash message. Neco na zpusob:

try {
        // tady se neco provede
} catch (Nette\Security\AuthenticationException $e) {

// a pokud to skonci chybou, tak presmerujeme a vypiseme zpravu
$odkaz = Nette\Utils\Html::el('a');
$odkaz->href('http://www.seznam.cz'); // url odkazu
$odkaz->setText('odkazem'); // text odkazu

$zprava = Nette\Utils\Html::el();
$zprava->add('Nějaký text s ')->add($odkaz)->add(' na jinou stránku.');

$this->flashMessage($zprava);
$this->redirect('Homepage:abcd');

Jednodussi moznost je vypnout escapovani flashmessage, ale to bych nedelal.

Editováno 18.8.2015 17:19
 
Nahoru Odpovědět
18.8.2015 17:18
Avatar
visekdo
Člen
Avatar
Odpovídá na d4rkw34v3r
visekdo:18.8.2015 18:41

Jojo, todle chápu, díky, ale já si tady takhle vytvářim výjimky (v UserManager), je tam i napsáno kam by tak měl směřovat ten odkaz, jen nevim ja toho docílit.

if (!$row) {
           throw new Nette\Security\AuthenticationException('Špatná Emailová adresa.', self::IDENTITY_NOT_FOUND);
       } elseif (!Passwords::verify($password, $row[self::COLUMN_PASSWORD_HASH])) {
           throw new Nette\Security\AuthenticationException('Špatné heslo.', self::INVALID_CREDENTIAL);
       }elseif($row[self::COLUMN_STATUS]==1){
           throw new Nette\Security\AuthenticationException("Váš účet není aktivní. Nový aktivační email si můžete nechat poslat kliknutím na následující odkaz <a n:href='Login:Resend'>odkaz</a>", self::NOT_APPROVED); // nějak takhle by měl vypadat ten odkaz
       } elseif($row[self::COLUMN_STATUS]==0){
           throw new Nette\Security\AuthenticationException('Váš účet je zablokován.', self::NOT_APPROVED);
       } elseif (Passwords::needsRehash($row[self::COLUMN_PASSWORD_HASH])) {
           $row->update(array(
               self::COLUMN_PASSWORD_HASH => Passwords::hash($password),
           ));
       }

Potom si přidávám v SignFormFactory ty zprávy z výjimek jako errory do formuláře. Jen nevim vůbec jak na ten odkaz.

try {
                        $this->user->login($values->username, $values->password);
                } catch (Nette\Security\AuthenticationException $e) {
                        $form->addError($e->getMessage());
                        }
 
Nahoru Odpovědět
18.8.2015 18:41
Avatar
d4rkw34v3r
Tvůrce
Avatar
Odpovídá na visekdo
d4rkw34v3r:18.8.2015 19:11

Zkus to takhle. Tu Authenticatio­nException si nech pouze u kontroly E-mailu a hesla i se zprávou (Nebo si taky můžeš vytvorit vlastni vyjimky pro tyhle dva stavy). U tech dalsich stavu si vytvoris vlastni konkretni vyjimky, ktere pote zachytis pri zpracovani prihlaseni. Takže by to mohlo vypadat nejak takhle napriklad:

if (!$row) {
        throw new Nette\Security\AuthenticationException('Špatná Emailová adresa.',
                                                                                          self::IDENTITY_NOT_FOUND);
} elseif (!Passwords::verify($password, $row[self::COLUMN_PASSWORD_HASH])) {
        throw new Nette\Security\AuthenticationException('Špatné heslo.', self::INVALID_CREDENTIAL);
}elseif($row[self::COLUMN_STATUS]==1){
        throw new Runtime\InactiveAccountException;
} elseif($row[self::COLUMN_STATUS]==0){
        throw new Runtime\InaccessibleAccountException;
} elseif (Passwords::needsRehash($row[self::COLUMN_PASSWORD_HASH])) {
        $row->update(
            array(self::COLUMN_PASSWORD_HASH => Passwords::hash($password))
        );
}

No a potom to muzes zpracovat napriklad takhle:

try {
        $this->user->login($values->username, $values->password);
} catch (Nette\Security\AuthenticationException $e) {
        $form->addError($e->getMessage());
        return;
} catch (Runtime\InactiveAccountException $i) {
        $odkaz = Nette\Utils\Html::el('a');
        $odkaz->href($this->link('Login:resend')); // url odkazu
        $odkaz->setText('odkaz'); // text odkazu

        $zprava = Nette\Utils\Html::el();
        $zprava->add('Váš účet není aktivní. Nový aktivační email si můžete nechat poslat kliknutím na
                               následující ')->add($odkaz);

        $form->addError($zprava);
        return;

} catch (Runtime\InaccessibleAccountException $ia) {
        $form->addError('Váš účet je zablokován.');
        return;
}

Proste jde o to, ze ten text vyjimky, ktery se tam snazis nacpat, se ti vzdycky prelozi spatne a ten odkaz se ti bude bude zobrazovat jako escapovany text. Jediny reseni by potom bylo vypnout escapovani ty message v sablone, coz je fuj. Tohle je asi jediny validni zpusob, jak toho dosahnout. Alespon tedy co vim ja.

Editováno 18.8.2015 19:14
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
18.8.2015 19:11
Avatar
visekdo
Člen
Avatar
Odpovídá na d4rkw34v3r
visekdo:19.8.2015 12:22

Díky moc

 
Nahoru Odpovědět
19.8.2015 12:22
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.