changeAction() – presmerovava, nepodstrkava

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

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)

ViliamKopecky
Nette hipster | 230
+
0
-

changeActionsetView

MelkorNemesis
Člen | 36
+
0
-

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.

Jod
Člen | 701
+
0
-

Použi $this->forward();

Vyki
Člen | 388
+
0
-

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
+
0
-

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
+
0
-

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)