changeAction() – presmerovava, nepodstrkava
- MelkorNemesis
- Člen | 36
Ahoj,
volam ve startupu v BasePresenteru funkci
<?php
protected function _initLogic() {
if (!$this->_user->isAuthenticated()) {
$this->flashMessage('Pro správu profilu se musíš přihlásit!', 'error');
// when user is not logged and trying to access ProfilePresenter
$this->changeAction('notlogged');
}
}
?>
Takze pokud vlezu na url „domena.cz/profil“ a nejsem prihlasen, zmeni to
akci na notlogged – to je fajn.
Ale nevim z jakeho duvodu me to presmeruje na domena.cz/profil/neprihlasen
(preklad v routach) – ja nechci byt presmerovan na jinou action, ja ji chci
jen podstrcit. V kodu Presenter.php v changeAction zadny redirect neni.
Muze mi nekdo poradit, jestli neni chyba u me? diky
Pro jistotu vice kodu
<?php
abstract class BasePresenter extends Presenter {
public $oldLayoutMode = FALSE;
protected $_user;
public function startUp() {
// set authenticate status false by default
$this->template->isAuthenticated = false;
// check, if user is authenticated
$this->_user = Environment::getUser();
if($this->_user->isAuthenticated()) {
$this->template->isAuthenticated = true;
$this->template->user = $this->_user->getIdentity();
}
$this->_initLogic();
}
protected function _initLogic() {}
}
// prebytecne veci v BasePresenteru jsem smazal
class ProfilePresenter extends BasePresenter{
public function actionDefault() {
$this->_setTitle('Správa profilu');
$this->template->profile = UsersTable::getWholeUserById($this->_user->getIdentity()->id);
}
public function actionNotlogged() {
$this->_setTitle('Chyba');
}
protected function _initLogic() {
if (!$this->_user->isAuthenticated()) {
$this->flashMessage('Pro správu profilu se musíš přihlásit!', 'error');
// when user is not logged and trying to access ProfilePresenter
$this->changeAction('notlogged');
}
}
}
?>
Editoval MelkorNemesis (29. 1. 2010 2:25)
- MelkorNemesis
- Člen | 36
to mi nepomuze, ono to do te akce nesmi vubec vlezt, musi to podstrcit
jinou
pokud nejsem prihlasenej, tak nemuzu jen zmenit view a nacitat z databaze
uzivatele podle ID, ktere v sessione nemam → error.
- Vyki
- Člen | 388
Když to potřebuji jednoduše tak to dělám tak, že zabezpečené presentery dědí od:
<?php
abstract class BaseAdminPresenter extends BasePresenter
{
public function startup() {
if (!Environment::getUser()->isAuthenticated()) {
$this->redirect(':auth:login', $this->getApplication()->storeRequest());
}
parent::startup();
}
}
?>
což zajistí, že to uživatele přesměruje pokud není přihlášen. Při přepisování metody startup se samozřejmě musí vždy volat jeho rodič. Jinak by vznikla bezpečnostní díra. V autentizaci mám potom
<?php
[...]
public function actionLogin($key = NULL){
if ($key) {
$this['loginForm']->setDefaults(array('key' => $key));
}
[...]
public function loginFormSubmitted($form)
{
[...]
if ($values['key'])
$this->getApplication()->restoreRequest($values['key']);
else
$this->redirect(':front:page:');
[...]
}
?>
Ukládání toho parametru $key
slouží k přenesení klíče
Requestu
. Když to provedeš takto tak tě to přesměruje po
přihlášení zpět na stránku, která tě kvůli nepřihlíšení
přesměrovala na přihlašovací form.
Editoval Vyki (29. 1. 2010 14:47)
- Vyki
- Člen | 388
Někdy může být nešikovné zadrátovat celý presenter pokud není uživatel přihlášen. Celkem elegantní řešení zabezpečení jednotlivých metod použil ve své aplikaci nette-blog Roman Sklenář. Nad zabezpečenými metodami má anotaci.
<?php
[...]
/** @secured */
public function renderEdit($id) { [...] }
[...]
?>
Presentery dědí od BasePresenteru,
kde se potom zjišťuje zda volaná metoda náhodou nemá anotaci
secured
a tím pádem zda není zabezpečená.
Editoval Vyki (29. 1. 2010 14:33)
- MelkorNemesis
- Člen | 36
Diky, udelam nejake podobne reseni jako vy – sice porad nevim proc changeAction() redirectuje, ale uz me to tolik netrapi, kdyz vidim, ze to nikdo moc nepouziva.
Edit: ty anotace vypadaji skvele!
Hezky den
Editoval MelkorNemesis (29. 1. 2010 16:25)