Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zabezpieczenie dostępu do metod
Forum PHP.pl > Forum > PHP > Object-oriented programming
spike20rz
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) {...

questionmark.gif
pinochet
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:
spike20rz
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?
mike
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.
pinochet
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.
spike20rz
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.
wlamywacz
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.
mike
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.
spike20rz
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.
wlamywacz
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.
mike
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ąć.
wlamywacz
A poza tym zwiększa to czytelność kodu, AMEN tongue.gif
spike20rz
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
mike
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.
spike20rz
No i o to chodzilo winksmiley.jpg thx mike winksmiley.jpg
pinochet
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)
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.