Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] zabronić dostęp do metody
Forum PHP.pl > Forum > PHP > Frameworki
AxZx
witam

w temacie Temat: Symfony_szablony_widoki opisałem jak można zapisać widok do bazy.
powstaje pytanie jak zabronić uruchomienia jakiejś akcji z przeglądarki?

żeby można było z tej metody korzystać w $this->getController()->getPresentationFor() ale żeby ktoś nie mógł sobie wpisać w pasku URL przeglądarki tej akcji i nie zobaczył rezultatu. to samo jest z metoda sendemail - tam też podaje się jakś konkretną akcję konkretnego modułu, jako akcja która wysyła maila.
phpion
Możesz ustawić jej widoczność na protected/private lub wywalić przedrostek execute. Wtedy daną metodę wywołasz "ręcznie" z danego kontrolera.
destroyerr
Za pomocą sfActionStack sprawdzasz czy akcja została wywołana przez inną akcje, tą którą Ty chcesz. Jesli nie to forward404, a jesli tak to spokojnie leci dalej.
Cysiaczek
Ewentualnie ustaw credentiala w locie smile.gif
AxZx
Cytat(phpion @ 25.11.2008, 21:33:12 ) *
Możesz ustawić jej widoczność na protected/private lub wywalić przedrostek execute. Wtedy daną metodę wywołasz "ręcznie" z danego kontrolera.


mogę ustawić i user nie będzie miał dostępu bezpośrednio z przeglądarki do akcji ale ta wtedy getPresentationFor też nie będzie miała dostępu.

Cytat(destroyerr @ 25.11.2008, 21:37:07 ) *
Za pomocą sfActionStack sprawdzasz czy akcja została wywołana przez inną akcje, tą którą Ty chcesz. Jesli nie to forward404, a jesli tak to spokojnie leci dalej.


a mógłbyś napisać coś więcej? jak tego używać?

przyszedł mi do głowy jeszcze jeden sposób.
można wykonać coś takiego:
  1. <?php
  2. $this->getRequest()->setAttribute('kontrola', 'xyz');
  3. $tresc = $this->getController()->getPresentationFor('kontakty', 'sendZapros', 'sfView');
  4. ?>


i w tej metodzie executeSendZapros sprawdzac
  1. <?php
  2. if($this->kontrola):
  3. ?>
Cysiaczek
No to chyba jednak prościej credentiala ustawić sleep.gif
destroyerr
Z credentialem to raczej bezsensowne bo nie do tego to służy.

Mniej więcej tak:
  1. <?php
  2. $lastEntry = $this->getController()->getActionStack()->getLastEntry();
  3. if($lastEntry->getModuleName() != $this->getModuleName() && $lastEntry->getActionName() != $this->getActionName())
  4. {
  5.    $this->forward404();
  6. }
  7. ?>
AxZx
coś nie tak.
bo $lastEntry->getActionName() ma taka samą wartość - wtedy kiedy wywołam ręcznie tą akcję jak i wtedy kiedy jest pobierany widok tej akcji przez metodę getPresentationFor.
chyba, że coś źle zrobiłem.

takie coś
  1. <?php
  2. public function executeZapros()
  3.    {
  4.        
  5.        if($this->getRequest()->getMethod() == sfRequest::POST)
  6.        {
  7.            
  8.            $this->getRequest()->setAttribute('zaproszenie', $zaproszenie);
  9.            
  10.            $tresc = $this->getController()->getPresentationFor('kontakty', 'sendZapros', 'sfView');
  11.            $temat = 'Zaproszenie do kontaktów';
  12.                    
  13.            return $this->my_redirect($this->powodzenie('Zaproszenie do kontaktów zostało wysłane'));
  14.        }
  15.    }
  16.    
  17.    public function executeSendZapros()
  18.    {
  19.        
  20.        $this->zaproszenie = $this->getRequest()->getAttribute('zaproszenie');
  21.  
  22.        $this->forward404Unless($this->zaproszenie);
  23.                
  24.        $this->setLayout(false);
  25.  
  26.    }
  27. ?>

działa fajnie, ale trzeba o tym atrybucie pamiętać i za każdym razem go ustawiać.
Cysiaczek
Nie chcę robić flejma, ale pozostanę przy zdaniu, że jednak właśnie do tego służy. Ten email to akcja i nadanie tymczasowego uprawniania do jej wykonania wydaje mi się całkiem sensowne. Po wykonaniu, credentiala usuwamy z listy.
Pozdrawiam.
AxZx
Cytat(Cysiaczek @ 25.11.2008, 23:11:29 ) *
Nie chcę robić flejma, ale pozostanę przy zdaniu, że jednak właśnie do tego służy. Ten email to akcja i nadanie tymczasowego uprawniania do jej wykonania wydaje mi się całkiem sensowne. Po wykonaniu, credentiala usuwamy z listy.
Pozdrawiam.


w ostateczności mogłoby tak być. ale ja nie chce żeby user wiedział, że jest taka akcja. żeby nie zobaczył komunikat o braku dostępu, czy formularza logowania, ale żeby zobaczył 404.

EDIT:
chyba się pomyliłem:)
bo Credentials jak ustawie w akcji to ja ustalam jaki ma być komunikat. okej:)
przepraszam za zamieszanie.
Cysiaczek
Heh, no właśnie o to mi chodziło - addCredential() -> hasCredential() -> removeCredential(), zamiast sztucznej zmiennej:)
destroyerr
Ten kod, który podałem powyżej to z rozpędu, dlatego nie działa.

Ten kod nie pozwala na dostanie się do akcji przez podany adres.
  1. <?php
  2. $actionStack = $this->getController()->getActionStack();
  3. $index = $actionStack->getSize() - 2;
  4. $entry = $actionStack->getEntry($index);
  5.  
  6. if((!$entry) || ($entry->getModuleName() == $this->getModuleName()) && ($entry->getActionName() == $this->getActionName()))
  7. {
  8.  $this->forward404();
  9. }
  10. ?>


A ten kod pozwoli na wywołanie akcji tylko z akcji, którą podasz.
  1. <?php
  2. $actionStack = $this->getController()->getActionStack();
  3. $index = $actionStack->getSize() - 2;
  4. $entry = $actionStack->getEntry($index);
  5.  
  6. if(($entry) && ($entry->getModuleName() != 'test' || $entry->getActionName() != 'A'))
  7. {
  8.  $this->forward404();
  9. }
  10. ?>


Jest jeszcze inna prosta metoda, poprzez routing. Dodać taką regułe, aby łapała adres do akcji chronionej i uruchamiała tą właściwą.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.