Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zabezpieczenie dostępu do metod, czyli metody dostepne tylko po zalogowaniu
spike20rz
post
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 6.01.2009

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


Witam,

Costam sobie dlubie od niedawna przy OOP i natknalem sie na taki problem:
Otóż mam klase App w ktorej robie wszystkie potrzebne akcje - tj laduje obiekt bazy, template itp.
Wszystkie metody mam poprawnie zahermetyzowane, wiec public mam tylko:
  1. <?php
  2. $a = new App();
  3. $a->doLogin($user,$pass); //wiadomo
  4. $a->show(); //pokazuje panel glowny badz okno logowania
  5. ?>


Jest to klasa glowna, z ktorej chce czesto,gesto dziedziczyc. Mam powiedzmy klase Posty
  1. <?php
  2. class Posty extends App {
  3. function __construct() {
  4.   parent::__construct();
  5.   //...i logika tego konstruktora
  6. }
  7. }
  8. ?>


Zastanawiam sie (od dluzszego juz czasu) jak zrobic zeby metody Posty byly dostepne tylko po wczesniejszym zalogowaniu - oczywiscie radze sobie z wyswietleniem formularza z logowaniem itd - to nie jest problem, problem jest taki ze chce zrobic API w oparciu o ta aplikacje i akcja typu:
  1. <?php
  2. $p = new Posty();
  3. $p->usunPost(9);
  4. ?>

.. powinna byc niemozliwa do wykonania bez istniejacej poprawnej sesji.
Da sie to zrobic bez sprawdzania stanu zalogowania w kazdej metodzie,
tj: public function usunPost($id) { if ($this->status) {...

(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)

Ten post edytował spike20rz 6.01.2009, 20:59:28
Go to the top of the page
+Quote Post
pinochet
post
Post #2





Grupa: Zarejestrowani
Postów: 120
Pomógł: 12
Dołączył: 9.10.2008
Skąd: Tricity.Rumia()

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


Cytat(spike20rz @ 6.01.2009, 20:55:58 ) *
... Jest to klasa glowna, z ktorej chce czesto,gesto dziedziczyc.

Nie rozumiem tego :] Jaki to ma sens w twojej aplikacji?

kiedyś dawno temu wymysliłem coś co zobrazuje takim pseudokodem:
  1. <?php
  2. function __autoload($name){
  3. if(logged_in){
  4.     require('authorized/'.$name.'.class.php');
  5. }else{
  6.     require('unauthorized/'.$name.'.class.php');
  7. }
  8. }
  9. ?>

To apropos nie sprawdzania w każdej metodzie czy user jest zalogowany. Oczywiście teraz preferuje bardziej wyszukane metody. :wink:

Ten post edytował pinochet 6.01.2009, 21:35:54
Go to the top of the page
+Quote Post
spike20rz
post
Post #3





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 6.01.2009

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


Cytat(pinochet @ 6.01.2009, 21:35:08 ) *
Nie rozumiem tego :] Jaki to ma sens w twojej aplikacji?


Ano sens ma taki ze klasy dziedzicza z niej potrzebne metody, chociazby te zwiazane z obsluga db - jest takim "nieabstrakcyjnym" szkieletem - niewiem jak to okreslic;]
Twoja metoda jest ciekawa, niemniej mnie nie urzadza - czy user jest zalogowany czy nie sprawdzam wlasnie wewnatrz klasy App, upychanie tego w autoload jest bez sensu. Aplikacja dziala w przegladarce i jest dobrze (w miare moich mozliwosci) zabezpieczona przed dostepem do metod wymagajacych logowania - poprostu to logowanie wyswietla juz z konstruktora i die() - jak juz pisalem chce utworzyc API, wiec wewnatrz obiektu musze jakos zezwolic badz nie na dostep do metod.
Cytat(pinochet @ 6.01.2009, 21:35:08 ) *
To apropos nie sprawdzania w każdej metodzie czy user jest zalogowany. Oczywiście teraz preferuje bardziej wyszukane metody.

Dlatego tez niechcac trącic amatorka zwrocilem sie na to forum i takowe metody chcialbym poznac - moglbys sie jakimis podzielic?

Ten post edytował spike20rz 6.01.2009, 21:56:16
Go to the top of the page
+Quote Post
mike
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Zacznijmy od tego, że musisz sobie uświadomić, że kompletnie nie rozumiesz programowania obiektowego. Im szybciej to do Ciebie dotrze tym szybciej oczyścisz umysł i się tego nauczysz.

Dostępu do metod nie zabezbiecza się w zależności od tego czy ktoś jest zalogowany czy nie. To Ty jako programista piszesz system i to Ty decydujesz czy metodę wykonać czy nie. Jeśli robisz coś co wymaga bycia zalogowanym a nie jesteś to jest błąd w projekcie. Taka sytuacja nie może się zdarzyć. Projektując aplikację i implementując ją masz zapewnić, że dana metoda nie będzie wykonana.

Ustawianie dostępu do metod (public, protected, private) to nie jest system autoryzacji. Jedno z drugim nie ma żadnego związku.
Go to the top of the page
+Quote Post
pinochet
post
Post #5





Grupa: Zarejestrowani
Postów: 120
Pomógł: 12
Dołączył: 9.10.2008
Skąd: Tricity.Rumia()

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


Cytat(spike20rz @ 6.01.2009, 21:55:00 ) *
Ano sens ma taki ze klasy dziedzicza z niej potrzebne metody, chociazby te zwiazane z obsluga db

Nie wiem skad czerpałeś swoją wiedzę o OOP ale w każdym artykule, ksiązce i opracowaniu przeczytasz ze takie używanie dziedziczenia jest nie zgodne z założeniem. Obiekty mają odzwierciedlać obiekty w rzeczywistości.

Powienieneś stworzyć na przykład osobną klasę do obsługi DB osobną do autoryzacji użytkowników itp ... itd ...
Nie wiem czy na początek jest dobre MVC ale poczytaj o tym wzorcu wałkowane w kółko na forum.
Na forum działa też wyszukiwarka w połączeniu manuale znanych lubianych sprawdzonych frameworków powinny ci dać podstawową więdzę w oparci o którą można zadawać pytania na forum.
Go to the top of the page
+Quote Post
spike20rz
post
Post #6





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 6.01.2009

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


Cytat
Zacznijmy od tego, że musisz sobie uświadomić, że kompletnie nie rozumiesz programowania obiektowego. Im szybciej to do Ciebie dotrze tym szybciej oczyścisz umysł i się tego nauczysz.

Byc moze, ale czytam ze zrozumieniem.
Cytat
Costam sobie dlubie od niedawna przy OOP

Nigdzie nie napisalem ze chce je zabezpieczac public/private/protected - hermetyzacja jest dla mnie i zdaje sobie z tego sprawe.
Poradzilem sobie (w dosc prymitywny sposob - byc moze ze pseudoobiektowy) narazie tak:
  1. <?php
  2. //kod przykladowy
  3. function API_usunPost($id,$session_token) {
  4.  
  5.   $del = new Post($session_token);
  6.   if (!$del->get_login_status())
  7.      return 'wrong_token';
  8.   if($del->deletePost($id))
  9.      return 'post_deleted';
  10.      return $del->error;
  11. }
  12. ?>

Taki sposob wystarczy przed dostepem z zewnatrz?

Cytat
Powienieneś stworzyć na przykład osobną klasę do obsługi DB osobną do autoryzacji użytkowników itp ... itd ...

Tak tez mam zrobione - klasa App wszystko spina do kupy.

Ten post edytował spike20rz 6.01.2009, 22:21:54
Go to the top of the page
+Quote Post
wlamywacz
post
Post #7





Grupa: Zarejestrowani
Postów: 535
Pomógł: 27
Dołączył: 3.05.2005

Ostrzeżenie: (20%)
X----


Cytat
  1. <?php
  2. if($del->deletePost($id))
  3.     return 'post_deleted';
  4.     return $del->error;
  5. ?>

Funkcja nie może zwrócić dwa razy danych. Wrzuć jakąś funkcję auth w konstruktor klasy i wyłącz dostęp do całego modelu/kontrolera. Ewentualnie wrzucaj ten auth do poszczególnych funkcji w klasie.
Go to the top of the page
+Quote Post
mike
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Cytat(spike20rz @ 6.01.2009, 22:20:09 ) *
Taki sposob wystarczy przed dostepem z zewnatrz?
Nie. To jest ostatnia rzecz jakie można pisać w OOP. Funkcja usunPost ma usunąć post. Zawsze.
To czy tą funkcje wykonać masz sprawdzić zanim ją wykonasz.
Go to the top of the page
+Quote Post
spike20rz
post
Post #9





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 6.01.2009

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


Cytat(wlamywacz)
Funkcja nie może zwrócić dwa razy danych. Wrzuć jakąś funkcję auth w konstruktor klasy i wyłącz dostęp do całego modelu/kontrolera. Ewentualnie wrzucaj ten auth do poszczególnych funkcji w klasie.

Nie zwraca dwa razy danych - pierwszy return jest po if - drugi jest jezeli ten if sie nie wykona, wiec po else, ktorego dla skrotow niepisalem.
Ale najwazniejsze - bo chyba o to od poczatku mi chodzi - jak wylaczyc wlasnie dostep do calego modulu, poki co po sprawdzeniu autoryzacji umiem co najwyzec dac die() gdy jej brak.
Cytat(mike)
Nie. To jest ostatnia rzecz jakie można pisać w OOP. Funkcja usunPost ma usunąć post. Zawsze.
To czy tą funkcje wykonać masz sprawdzić zanim ją wykonasz.

To byl tylko przyklad, ale dziekuje - cenie Twoja wiedze i wypowiedzi na forum.
Go to the top of the page
+Quote Post
wlamywacz
post
Post #10





Grupa: Zarejestrowani
Postów: 535
Pomógł: 27
Dołączył: 3.05.2005

Ostrzeżenie: (20%)
X----


No to zamiast die przekieruj do np. funkcji widoku z formularzem do logowania, a odciąć dostęp dla całej klasy to daj po prostu sprawdzanie warunku w konstruktorze.
Go to the top of the page
+Quote Post
mike
post
Post #11





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Cytat(spike20rz @ 6.01.2009, 22:43:47 ) *
Nie zwraca dwa razy danych - pierwszy return jest po if - drugi jest jezeli ten if sie nie wykona, wiec po else, ktorego dla skrotow niepisalem.
Mały tip: standardy kodowania wymagają używania nawiasów klamrowych do objęcia bloków kodu. Powinny być nawet jeśli można je w danej sytuacji pominąć.
Go to the top of the page
+Quote Post
wlamywacz
post
Post #12





Grupa: Zarejestrowani
Postów: 535
Pomógł: 27
Dołączył: 3.05.2005

Ostrzeżenie: (20%)
X----


A poza tym zwiększa to czytelność kodu, AMEN (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
spike20rz
post
Post #13





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 6.01.2009

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


Cytat(wlamywacz @ 6.01.2009, 22:49:45 ) *
No to zamiast die przekieruj do np. funkcji widoku z formularzem do logowania, a odciąć dostęp dla całej klasy to daj po prostu sprawdzanie warunku w konstruktorze.

Kilka postow wyzej napisalem ze dokladnie tak robie - wyswietla sie logowanie - tylko ze w przegladarce, chce jednak odcinac dostep dla hmm... kodu php z zewnatrz - czyli funkcji api ktore daja dostep do poszczegolnych metod klas, w sposob pokazany tez wyzej. Wiec mam dwa - prymitywne - pomysly ktore tu przedstawilem - sprawdzanie w kazdej metodzie pola odpowiedzialnego za status logowania, badz funkcje z zewnatrz laduja obiekt np z parametrem - $a->new Post($session_token), ktory w konstruktorze zablokuje wyswietlenie logowania (nie moge zwrocic html przez soap) - pytanie tylko jak zablokowac dostep do samych funkcji, zeby pozniej wywolanie $a->deletePost($id) bylo niemozliwe
Go to the top of the page
+Quote Post
mike
post
Post #14





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Cytat(spike20rz @ 6.01.2009, 23:02:50 ) *
Kilka postow wyzej napisalem ze dokladnie tak robie - wyswietla sie logowanie - tylko ze w przegladarce, chce jednak odcinac dostep dla hmm... kodu php z zewnatrz - czyli funkcji api ktore daja dostep do poszczegolnych metod klas, w sposob pokazany tez wyzej.
Po co? Przecież to mija się z celem.
Jedyne co masz zrobić to zadbać o to by metoda nie została wykonana a nie odcinać dostęp do klas. Tak się nie robi.
Go to the top of the page
+Quote Post
spike20rz
post
Post #15





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 6.01.2009

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


No i o to chodzilo (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) thx mike (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
pinochet
post
Post #16





Grupa: Zarejestrowani
Postów: 120
Pomógł: 12
Dołączył: 9.10.2008
Skąd: Tricity.Rumia()

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


Cytat(spike20rz @ 6.01.2009, 22:20:09 ) *
Byc moze, ale czytam ze zrozumieniem.

Nie odpowiedziałeś nadal na moje pytanie ... tam jest okolicznik miejsca a ty napisałeś ogólnie na czym polega dziedziczenie.
Cytat(spike20rz @ 6.01.2009, 22:20:09 ) *
Tak tez mam zrobione - klasa App wszystko spina do kupy.
spina w ten sposób, że wszystkie inne klasy z niej dziedziczą ? ( patrz wyżej)

Cytat(spike20rz @ 6.01.2009, 22:43:47 ) *
Ale najwazniejsze - bo chyba o to od poczatku mi chodzi - jak wylaczyc wlasnie dostep do calego modulu,

Dostałeś odpowiedź w pierwszym poście :] Napisałeś że upychanie sprawdzania do autoload jest bez sensu ale nikt tu nie upycha sprawdzania do autoload.
if(logged_in) = na przykład: if($instancja_app->UserLoggedIN)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 15.09.2025 - 02:19