Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa uwierzytelnienia
Forum PHP.pl > Forum > PHP > Object-oriented programming
eMartio
Witam na forum smile.gif Od 2 lat programuje strukturalnie. Jednak od obecnie jestem w trakcie migracji na programowanie zorientowane obiektowo.

Czy mógłby ktoś z Szanowanych Forumowiczów pokazać mi jak stworzyć przy OOP prostą klasę uwierzytelniającą? Chodzi o to, że chciałbym, aby klasa ta sprawdzała czy user jest zalogowany, jak tak, to kontynuuje działanie aplikacji, a jak nie to ma odesłać na stronę z formularzem logowania.

Stworzyłem coś takiego:
  1. <?php
  2. class MojeUwierzytelnianie {
  3. _construct () {
  4. if ($this->czy_zalogowany()) return TRUE;
  5. }
  6.  
  7. function czy_zalgowany() {
  8. if ($_SESSION['id_user']) {
  9. return TRUE;
  10. } else {
  11. header('location: formularz_logowania.php');
  12. }
  13. }
  14. }
  15. ?>


Chyba jednak nie jest to prawidłowo skonstruowana klasa? Proszę o pomoc i radę.
bigZbig
Jesli chodzi o poprawnosc skladni w PHP5 to:

  1. <?php
  2. class MojeUwierzytelnianie {
  3.  
  4. public function _construct () {
  5. if ($this->czy_zalogowany()) return TRUE;
  6. }
  7.  
  8. public function czy_zalgowany() {
  9. if ($_SESSION['id_user']) {
  10. return TRUE;
  11. } else {
  12. header('location: formularz_logowania.php');
  13. }
  14. }
  15. }
  16. ?>
NuLL
  1. <?php
  2.  
  3. class user
  4. {
  5.     private 
  6.         $userId;
  7.     
  8.     public static function instance()
  9.     {
  10.         static 
  11.             $userObj;
  12.             
  13.         if($userObj==null)
  14.         {
  15.             $userObj=&new user();
  16.         }
  17.         
  18.         return $userObj;
  19.     }
  20.     
  21.     private function __construct()
  22.     {
  23.         $this->userId=0;
  24.     }
  25.     
  26.     public function login($login,$password)
  27.     {
  28.         //funkcja logujaca
  29.         
  30.         //tutaj sie przypisuje $this->userId;
  31.     }
  32.     
  33.     public function isLogged()
  34.     {
  35.         return intval($this->userId)>0;
  36.     }
  37.     
  38.     public function logout()
  39.     {
  40.         $this->userId=0;
  41.     }
  42. }
  43.  
  44. ?>

A moze tak ? Kazdy user ma jakis tam id ktory przypisujesz. Jesli id jest rowny zero to oznacza ze jest to gosc. Co do dwoch pierwszych method odsylam do manuala i wzorca singleton : http://pl2.php.net/manual/en/language.oop5.patterns.php
Martio_L
Cytat(NuLL @ 2006-01-12 14:27:46)
  1. <?php
  2.  
  3. class user
  4. {
  5. private 
  6. $userId;
  7.  
  8. public static function instance()
  9. {
  10. $userObj;
  11.  
  12. if($userObj==null)
  13. {
  14. $userObj=&new user();
  15. }
  16.  
  17. return $userObj;
  18. }
  19.  
  20. private function __construct()
  21. {
  22. $this->userId=0;
  23. }
  24.  
  25. public function login($login,$password)
  26. {
  27. //funkcja logujaca
  28.  
  29. //tutaj sie przypisuje $this->userId;
  30. }
  31.  
  32. public function isLogged()
  33. {
  34. return intval($this->userId)>0;
  35. }
  36.  
  37. public function logout()
  38. {
  39. $this->userId=0;
  40. }
  41. }
  42.  
  43. ?>

A moze tak ? Kazdy user ma jakis tam id ktory przypisujesz. Jesli id jest rowny zero to oznacza ze jest to gosc. Co do dwoch pierwszych method odsylam do manuala i wzorca singleton : http://pl2.php.net/manual/en/language.oop5.patterns.php

Dziękuję. Może mi trochę wytłumaczyć działanie tej klasy? Z tego, co na szybkiego przeanalizowałem, klasa ta nie sprawdza zmiennej sesyjnej, abym móc użyć klasy na wielu stronach?
NuLL
Sesje tu trzeba dodac smile.gif
W systemie masz jeden egzemplarz takiej klasy reprezentujacy uzytkownika. W metodach __contruct,login,logout trzeba dodac obsluge sesji. W konstruktorze sprawdzasz czy jest moze stara sesja - jesli tak to ja zaladowac. W funkcji login tworzysz odpowiednie zmienne sesyjne w logout je czyscisz i session_destroy().
eMartio
Jakie uwierzytelnienie (sprawdzenie na podstronie czy user jest zalogowany) jest najbardziej optymalne i bezpieczne?

Obiło mi się o uszy, że używanie zmiennych sesyjnych nie jest bezpieczne.

Zawsze robiłem tak:

  1. <?php
  2. if (!$_SESSION['id_usera']) { header('location: formularz.php5'); }
  3. ?>


poprawiam
---
nospor



Jak powyższą składnię wstawić do klasy NuLLa? Jak to zrobić przy modelu MVC? Konstruktor powinien odsyłać do formularza czy model czyli ta klasa?

Proszę o pomoc.
Ociu
  1. <?php
  2. public function login($login, $password) {
  3. if($login == LOGIN && $password == PASSWORD) {
  4. $this->userId = 12;
  5. }
  6. }
  7. ?>

logowanie + sprawdzanie
  1. <?php
  2. $User = user::insatnce();
  3. $User->login('ociu', 'password');
  4. if(!$User->isLogged) header('Location: form.php');
  5. ?>
splatch
@NuLL odesłałeś do manuala a sam nie użyłeś pola statycznego, które w przykładzie na php.net jest winksmiley.jpg
  1. <?php
  2. class user {
  3. private $userId;
  4.  
  5. // po co sa pola statyczne w PHP5?
  6. static protected $userObj;
  7.  
  8. public static function instance() {
  9. if(self::$userObj==null) {
  10. self::$userObj = new self;
  11. }
  12. return self::$userObj;
  13. }
  14.  // ...
  15. }
  16. ?>
eMartio
OK. Dzięki. To tylko ostatnia kwestia. Czy uwierzytelnianie oparte na sesjach standardowych jest bezpieczne? Czy lepiej oprzeć to o własną obsługę sesji zapisywaną w bazie danych?
sf
Cytat(eMartio @ 2006-01-24 15:28:12)
OK. Dzięki. To tylko ostatnia kwestia. Czy uwierzytelnianie oparte na sesjach standardowych jest bezpieczne? Czy lepiej oprzeć to o własną obsługę sesji zapisywaną w bazie danych?

Wydaje mi sie, ze jest o ile nie ma dostepu do Twoich plikow sesyjnych inny uzytkownik.
UDAT
@szczurek
Czytaj przykłady.

  1. <?php
  2. $User = user::insatnce();
  3. $User->login('ociu', 'password');
  4. if(!$User->isLogged) header('Location: form.php');
  5. ?>


Tak tego się używa, bo to jest Singleton.
szczurek
Tak, dzięki. Przeczytałem to jeszcze raz dlatego wykasowałem swój post.
Turgon
sf każdy ma dostęp do katalogu /tmp, a tam trzymane są dane sesji. Moje info opieram na PHP5 Zaawansowane Programowanie.
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.