Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Użycie logowania w bezpieczny sposób
Forum PHP.pl > Forum > PHP > Object-oriented programming
Robert3d
Witam

Piszę moduł logowania i zastanawiam się jak go używać.
Co jest bezpieczniejsze a może nie ma to znaczenia

  1. $logowanie->SprawdzCzyZalogowany(); // <- zobacz czy jest ok / lub die
  2.  
  3. // dalsza czesc strony
  4.  


czy może
  1. $
  2. if($logowanie->SprawdzCzyZalogowany() == 1){
  3.  
  4. /// zalogowany
  5.  
  6. }else{
  7.  
  8. /// zaloguj sie
  9.  
  10. }
adbacz
Ja w swoich aplikacjach kiedyś używałem tego drugiego rozwiązania podanego przez Ciebie, tam gdzie potrzebowałem, ale po jakimś czasie doszło do tego, że to rozwiązanie było ajgorsze z możliwych bo jak przyszło co doc zego (do modyfikacji i dodawania) i była potrzeba ingerencji w jakąkolwiek część systemu logowania - to trzeba było zmieniac wszystko. Teraz jestem mądrzejszy, i zawsze kiedy mogę, to pisze sobie jakiś kawałek kody (nawet w przykłądowej klasie AutoRun), który będzie uruchamiany z każdym requestem. W tedy, dodajesz sobie tylko troszke if-ów (bo wątpię, żeby się bez tego obyło, chyba, że to aplikacja gdzie user MUSI być zalogowany by działać), kiedy i w jakich okolicznościach ma sprawdzać czy user jest zalogowany i to wszystko. A jak dojdzie co do czego to zmian dokonujesz tylko w jednym kawałku kodu.
Robert3d
Dzięki ci za odpowiedz mam jeszcze jedno pytanie jakiego wzorca użyć najlepiej do pisania modułu logowania bo pisze już go 2 raz i zawsze mi się nie podoba biggrin.gif
adbacz
Wzorca? To zależy od tego co potrzebujesz. Nikt Ci raczej nie powie dokłądnie "Użyj tego i tego, bo ja tego używam i to jest najlepsze", no chyba, że ktoś na prawdę nie jest zbyt myślącym i nie uczy się nowego tylko jedzie na starym "sprawdzonym". Napisz może jak Twoja aplikacja wygląda, w czym ją piszesz (jakiś FW, OOP a może strukturalnie), i jak do tej pory pisałeś, że stwierdziłeś, że Ci się "nie podoba" (wink.gif), może w tedy uda się coś podpowiedzieć. Ale nie oczekuj tego, że ktoś Ci pokaże dokładną drogę. Praca programisty polega na myśleniu i tylko czasami używaniu gotowców, w większości rzeczy trzeba samemu rozwiązać problem. A dlaczego? Bo na 90% rożawiązując go samemu czegoś się nauczysz.
by_ikar
U siebie rozwiązuje to w ten sposób, że kontroler praktycznie uruchamiam na samym końcu, a wszystko co jest przed nim, w "jądrze" frameworka, uruchamia się różnie. Różnie, znaczy tyle, że są pewne elementy które muszą zostać uruchomione (cache, request, response, templates itp), ale również są elementy opcjonalne, które się uruchamiają jeżeli ustawię je w konfiguracji. Do takich uruchamianych w zależności od potrzeb, klas, należą klasy bazy danych, obsługi użytkownika, internacjonalizacja, sesja itp. Klasy do obsługi użytkownika, bo jest ich kilka, mają swoje zadanie. I jest tam między innymi klasa Authentication, odpowiedzialna za uwierzytelnianie użytkownika. Normalnie nie zalogowany użytkownik, dostaje odpowiednią role: ROLE_GUEST, jeżeli sobie w routingu ustawię że dla danej akcji wymagane będzie uprawnienie ROLE_USER, to klasa Authentication sprawdzi jaki poziom uprawnień posiada użytkownik i jest kilka warunków. Sprawdzanie czy zalogowany (ROLE_USER) i jeżeli nie jest, jest przekierowywany na podstronę logowania, jeżeli jest zalogowany i nie posiada odpowiednich uprawnień (ROLE_ADMIN przykładowo) dostaje komunikat (domyślnie wyjątek AccessDeniedException który dziedziczy po HttpException i dostanie błąd 403) o tym że nie posiada odpowiednich uprawnień.

Jeżeli bym umieścił gdzieś w module kod odpowiedzialny za uwierzytelnianie to powielać bym go musiał wiele razy. Jeżeli wrzuciłbym gdzieś to do kontrolera, a jednocześnie nie chciałbym używać klas użytkownika, również bym posiadał kod który robi coś, do czego dana klasa nie została przeznaczona. A ładowanie takiej usługi użytkownika, jest względnie proste:

  1. if(Config::has('framework.default_database') && Config::has('framework.session') && Config::has('framework.users'))
  2. {
  3. $this->container->setService('user.manager', new UserManager($this->container->getService('database'), $this->container->getService('request')));
  4. $this->container->setService('user', new User());
  5. $this->container->setService('user.auth', new Authentication($this->container));
  6. $this->container->setService('group.manager', new GroupManager($this->container->getService('database')));
  7. }


Z racji że przetestowałem kilka wariantów, wydaje mi się takie wyjście w moim przypadku najsłuszniejsze. Pomyśl o czymś podobnym, żeby całość jakoś elegancko wyglądała. Zwłaszcza z tym dostępem do strony, dla użytkownika o odpowiednich uprawnieniach wink.gif
ano
Piszesz Symfony3? ;-)
by_ikar
Cytat(ano @ 5.01.2012, 00:44:36 ) *
Piszesz Symfony3? ;-)


Nie, ale trochę się wzorowałem na symfony. Trochę na zendzie, trochę na Yii i trochę na kohanie wink.gif
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.