Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony] zabronić dostęp do metody
AxZx
post 25.11.2008, 19:19:10
Post #1





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

Ostrzeżenie: (0%)
-----


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.


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
phpion
post 25.11.2008, 19:33:12
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Możesz ustawić jej widoczność na protected/private lub wywalić przedrostek execute. Wtedy daną metodę wywołasz "ręcznie" z danego kontrolera.
Go to the top of the page
+Quote Post
destroyerr
post 25.11.2008, 19:37:07
Post #3





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Cysiaczek
post 25.11.2008, 19:51:17
Post #4





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Ewentualnie ustaw credentiala w locie smile.gif


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
AxZx
post 25.11.2008, 20:02:28
Post #5





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

Ostrzeżenie: (0%)
-----


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. ?>


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
Cysiaczek
post 25.11.2008, 20:03:48
Post #6





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




No to chyba jednak prościej credentiala ustawić sleep.gif


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
destroyerr
post 25.11.2008, 20:36:42
Post #7





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował destroyerr 25.11.2008, 20:37:08
Go to the top of the page
+Quote Post
AxZx
post 25.11.2008, 21:02:06
Post #8





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

Ostrzeżenie: (0%)
-----


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ć.


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
Cysiaczek
post 25.11.2008, 21:11:29
Post #9





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




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.


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
AxZx
post 25.11.2008, 21:18:42
Post #10





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

Ostrzeżenie: (0%)
-----


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.

Ten post edytował AxZx 25.11.2008, 21:20:04


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
Cysiaczek
post 25.11.2008, 21:58:34
Post #11





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Heh, no właśnie o to mi chodziło - addCredential() -> hasCredential() -> removeCredential(), zamiast sztucznej zmiennej:)


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
destroyerr
post 28.11.2008, 13:38:22
Post #12





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


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ą.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 19:50