Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Klasa logowania usera
michalboss
post
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 31.07.2015

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


Witam

Napisałem taką klasę logowania użytkownika w systemie.
Nie jest jeszcze skończona, ale chciałem prosić o ewentualne wskazanie błędów w w/w kodzie, ponieważ dopiero zaczynam OOP w php.

  1. <?php
  2.  
  3. class Login
  4. {
  5.  
  6. private $_dbh;
  7. private $_config;
  8. private $_lang;
  9. private $_isLoggin = FALSE;
  10. private $_idSession;
  11. private $_email;
  12. private $_password;
  13.  
  14. public function __construct($dbh, $config, $lang)
  15. {
  16. $this -> _dbh = $dbh;
  17. $this -> _config = $config;
  18. $this -> _lang = $lang;
  19. }
  20.  
  21. /**
  22.   * Metoda sprawdza czy user jest zalogowany w systemie
  23.   *
  24.   * @access public
  25.   * @return bool
  26.   */
  27. public function checkLoggin()
  28. {
  29. return $this -> _isLoggin;
  30. }
  31.  
  32. /**
  33.   * Metoda sprawdza czy istnieją zmienne sesyjne - jeśli tak, to loguje usera w klasie
  34.   *
  35.   * @access public
  36.   * @return bool
  37.   */
  38. protected function isLoggin()
  39. {
  40. if($_SESSION['isLoggin'] == TRUE)
  41. {
  42. $this -> _isLoggin = $_SESSION['isLoggin'];
  43. $this -> _idSession = session_id();
  44. $this -> _email = $_SESSION['email'];
  45. return TRUE;
  46. }
  47. else
  48. {
  49. return FALSE;
  50. }
  51. }
  52.  
  53. /**
  54.   * Metoda logowania - sprawdzania czy użytkownik jest zalogowany i czy istnieją zmienne formularza logowania
  55.   * Jeśli tak, to sprawdza w bazie poprawność e-mail oraz hasła i dokonuje logowania w systemie
  56.   *
  57.   * @access public
  58.   * @return void
  59.   */
  60. public function userLogin()
  61. {
  62. $errorMsg = '';
  63. if(!($this -> _isLoggin) && isset($_POST['logEmail']) && isset($_POST['logPassword']))
  64. {
  65. $sql = $this -> _dbh -> prepare('SELECT A.IdUser, A.Email, A.Password, A.Salt, A.FirstName, A.LastName, A.ErrorLogin, A.ErrorLoginTime, A.Current '
  66. . 'FROM `users` A '
  67. . 'WHERE A.Email=:email LIMIT 1');
  68. $sql -> bindValue(':email', $_POST['logEmail'], PDO::PARAM_STR);
  69. $sql -> execute();
  70. if($sql -> rowCount() > 0)
  71. {
  72. if($row = $sql -> fetch())
  73. {
  74. if(self::encode($_POST['logPassword'], $row['Salt']) == $row['Password'])
  75. {
  76. $_SESSION['isLoggin'] = TRUE;
  77. $_SESSION['email'] = $row['Email'];
  78. $_SESSION['IdUser'] = $row['IdUser'];
  79. $this -> isLoggin();
  80. }
  81. else
  82. {
  83. $errorMsg = $this -> _lang['errorLogin'];
  84. }
  85. }
  86. }
  87. else
  88. {
  89. $errorMsg = $this -> _lang['errorLogin'];
  90. }
  91.  
  92. if(!empty($errorMsg))
  93. {
  94. throw new Exception($errorMsg);
  95. }
  96. }
  97. else if(!($this -> _isLoggin) && isset($_SESSION['isLoggin']) && $_SESSION['isLoggin'] == TRUE)
  98. {
  99. $this -> isLoggin();
  100. }
  101. }
  102.  
  103. /**
  104.   * Metoda wylogowuje uzytkownika i usuwa sesję
  105.   *
  106.   * @access public
  107.   * @return void
  108.   */
  109. public function userLogout()
  110. {
  111. unset($_SESSION);
  112. unset($this -> _isLoggin);
  113. unset($this -> _idSession);
  114. unset($this -> _email);
  115. header("Location: index.php?msg=logout");
  116. }
  117.  
  118. /**
  119.   * Metoda hashuje hasło używając podanej soli z kartoteki usera
  120.   *
  121.   * @access public
  122.   * @param string $Password
  123.   * @param string $Salt
  124.   * @return string
  125.   */
  126. public static function encode($Password, $Salt)
  127. {
  128. return hash('sha256', $Salt . hash('sha256', $Password . $Salt));
  129. }
  130.  
  131. /**
  132.   * Metoda tworzy sól podanego hasła
  133.   *
  134.   * @access public
  135.   * @param string $Password
  136.   * @return string
  137.   */
  138. public static function salt($Password)
  139. {
  140. return substr(hash('sha256', microtime() . substr($Password, 0, 3)), 0, 5);
  141. }
  142.  
  143. public static function timemicro()
  144. {
  145. list($z1, $se) = explode(" ", microtime());
  146. return ((float) $z1 + (float) $se);
  147. }
  148.  
  149. }
  150. ?>
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
CuteOne
post
Post #2





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


Już trochę lepiej to wygląda ale gdybyś pracował jako programista taki kod nigdy nie wszedłby na produkcję (IMG:style_emoticons/default/wink.gif) Dobra rada - spróbuj swoich sił z jakimś frameworkiem np. Zend 1/2, Symfony 2, CakePHP. Zobaczysz jak powinno się pisać aplikacje, czym tak naprawdę jest OPP (to nie zbiór metod w klasie X) i jak z niego korzystać

Szybkie CR
1. Nie rób jednej klasy, która robi masę różnych rzeczy - widziałeś kiedyś bolida F1, który kosi trawnik, ora pole i rozwozi mleko? Podziel tą klasę na mniejsze odpowiadające różnym zadaniom
- coś odpowiedzialnego za obsługę sesji
- coś co filtruje/waliduje dane
- klasa autoryzacji (nie myl z "logowaniem" - klasa logowania jedynie korzysta z klas autoryzacji)
- klasa obsługująca akcje autoryzacyjne - logowanie, wylogowanie czy rejestracja
- klasa trzymająca dane użytkownika - login, id itp.
- klasa obsługująca hashowanie
itp.
2. Za dużo if else. Poważnie... przemyśl czy nie da się tego uprościć/rozbić na kilka metod
3. " header("Location: index.php?msg=logout");" to powinno wylecieć, metoda logout ma TYLKO jedno zadanie - usuń sesję użytkownika - tyle, żadnych redirectów czy echów. To samo tyczy się innych metod
4. Do konstruktora, możesz przekazać tablicę jako handler bazy danych (brak "wymuszenia" typu danych)
5. Pomijam ocenę tych czasochłonnych operacji przy generowaniu soli (kwestia gustu) jednak istnieją prostsze metody jej generowania (IMG:style_emoticons/default/wink.gif)
6. Cóż to za potworek.. ?
  1. else if(!($this->isLogged) && isset($_SESSION['isLogged']) && $_SESSION['isLogged'] == TRUE)

7. I kolejny
  1. (...)$errorMsg = $this->lang['errorLoginTime'] . ' ' . $timeCheckMin . ' min.';(...)
  2. (...)$errorMsg = $this->lang['errorLogin'];(...)
  3. //itp.
  4. // a później..
  5. if(!empty($errorMsg))
  6. {
  7. throw new Exception($errorMsg);
  8. }


@edit w metodzie 'userLogin()' robisz
  1. $this->isLogged = TRUE;
  2. $this->email = $row['Email'];
  3. $this->idUser = $row['IdUser'];
  4. $this->idSession = session_id();
  5. $this->setSessionData();

po czym w setSessionData() robisz ponownie to samo...

Ten post edytował CuteOne 1.08.2015, 22:58:24
Go to the top of the page
+Quote Post

Posty w temacie
- michalboss   Klasa logowania usera   31.07.2015, 20:26:06
- - Damonsson   Żeby było szybciej napiszę co jest dobrze: nic. Ni...   31.07.2015, 20:48:38
|- - audiodesign10   Cytat(Damonsson @ 31.07.2015, 21:48:3...   3.08.2015, 21:00:29
|- - Damonsson   Cytat(audiodesign10 @ 3.08.2015, 22:00...   4.08.2015, 12:05:15
- - CuteOne   Szybkie code review: 1. [PHP] pobierz, plaintext ...   31.07.2015, 21:49:02
- - michalboss   Dzięki za odp - poprawię ten kod i dam jeszcze raz...   1.08.2015, 09:20:15
- - Skie   2. Tutaj koledze chodziło o to, że nazwy metod jak...   1.08.2015, 13:55:48
|- - Damonsson   Cytat(Skie @ 1.08.2015, 14:55:48 ) Ta...   1.08.2015, 14:32:38
- - michalboss   To chyba najlepiej podwójne hashowanie sola z bazy...   1.08.2015, 18:51:37
- - Pyton_000   A nie lepiej użyć jednego kodowania ale mocnego? D...   1.08.2015, 18:58:44
- - Skie   CytatDlatego jestem zwolennikiem trzymania soli za...   1.08.2015, 20:29:07
|- - borabora   Cytat(Skie @ 1.08.2015, 21:29:07 ) Be...   1.08.2015, 20:40:56
- - michalboss   Trochę zmieniłem kod klasy - może to jest trochę b...   1.08.2015, 21:11:23
- - CuteOne   Już trochę lepiej to wygląda ale gdybyś pracował j...   1.08.2015, 22:53:13
- - michalboss   Z tego co piszesz to rozumiem że lepiej zrobić zam...   3.08.2015, 11:00:21
- - marcio   Jesli chcesz spojrz na moja klase do logowania nie...   3.08.2015, 12:15:59
- - Pyton_000   I jest równie fatalnie napisana co autora wątku.   3.08.2015, 12:50:24
- - marcio   Cytat(Pyton_000 @ 3.08.2015, 13:50:24...   3.08.2015, 18:06:58
- - Pyton_000   A kto powiedział że takową mam. Ja nie wymyślam ko...   3.08.2015, 18:55:57
- - marcio   Cytat(Pyton_000 @ 3.08.2015, 19:55:57...   4.08.2015, 09:06:32
|- - !*!   Cytat(marcio @ 4.08.2015, 10:06:32 ) ...   4.08.2015, 11:24:38
- - marcio   Cytat(Damonsson @ 4.08.2015, 13:05:15...   4.08.2015, 13:14:54
|- - Damonsson   Cytat(marcio @ 4.08.2015, 14:14:54 ) ...   4.08.2015, 16:38:58
- - viking   Najlepiej podpatrzeć jak to robią duzi: https://gi...   4.08.2015, 14:15:56
- - pyro   Niewymyślanie koła na nowo to teraz oznaka lenistw...   4.08.2015, 17:40:05
- - marcio   Cytat(Damonsson @ 4.08.2015, 17:38:58...   5.08.2015, 10:47:20
- - Pyton_000   Zawsze możesz iść na inne gdzie będziesz się lepie...   5.08.2015, 11:12:43
- - marcio   Cytat(pyro @ 4.08.2015, 18:40:05 ) Ni...   5.08.2015, 17:04:04
- - MESSIAH :)   Dokładnie też to zauważyłem. Jeszcze Comandeer pró...   6.08.2015, 20:15:00
|- - Ksar   Offtopując. Cytat(MESSIAH :) @ 6.08....   6.08.2015, 22:26:31
|- - Damonsson   Skoro moderatorzy nie reagują na raporty, znaczy, ...   6.08.2015, 22:37:55
|- - Ksar   Cytat(Damonsson @ 6.08.2015, 23:37:55...   6.08.2015, 22:42:56
- - com   MESSIAH no bez jaj, pomaganie !== zrobienie z...   6.08.2015, 21:30:38
- - com   Róbcie co się wam podoba tylko jak ktoś przychodzi...   6.08.2015, 22:36:33
- - com   bo robienie czegoś co już jest i dawanie tego do o...   6.08.2015, 22:51:33
- - marcio   @Damonsson: Cytatktóre napisalibyśmy w 95% tak sam...   7.08.2015, 16:07:29
|- - !*!   Cytat(marcio @ 7.08.2015, 17:07:29 ) ...   7.08.2015, 17:25:19
|- - MESSIAH :)   Cytat(!*! @ 7.08.2015, 18:25...   7.08.2015, 19:43:30
- - memory   przecież dostałeś odpowiedź o co ci teraz chodzi?   7.08.2015, 20:04:47
- - CuteOne   @MESSIAH jeżeli tamten temat wyglądał jak ten Tem...   7.08.2015, 20:10:45
- - Daiquiri   Ludziska skończcie proszę te wycieczki osobiste - ...   8.08.2015, 08:42:57
- - marcio   CytatPrzecież już Ci wyjaśnił że nie, ponieważ nie...   8.08.2015, 12:05:01
|- - !*!   Cytat(marcio @ 8.08.2015, 13:05:01 ) ...   8.08.2015, 12:28:06
- - Daiquiri   !*!, Marcio - nie zaśmiecajcie już tematu.   8.08.2015, 12:56:36


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: 27.12.2025 - 21:29