Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

3 Stron V   1 2 3 >  
Reply to this topicStart new topic
> Klasa logowania usera
michalboss
post 31.07.2015, 20:26:06
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
Damonsson
post 31.07.2015, 20:48:38
Post #2





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


Żeby było szybciej napiszę co jest dobrze: nic. Nie jestem złośliwy w tym wypadku, uwierz. Może komuś będzie się chciało tłumaczyć, więc nie kasuj wątku.

Wygoogluj sobie: php oop example, php oop login example itp.
Go to the top of the page
+Quote Post
CuteOne
post 31.07.2015, 21:49:02
Post #3





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

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


Szybkie code review:
1.
  1. $this -> _dbh

znacznie czytelniejsza wersja
  1. $this->dbh

2. Nazwy metod z 4 liter. np "checkLoggin()"
3. $_SESSION['isLoggin'] rzuci notice jeżeli klucz nie istnieje
4. Odpowiedz mi na pytanie, po cholerę w metodzie, która ma przypisać coś do czegoś robisz return bool? Zamiast zwyczajnie przypisać i opuścić metodę
  1. /**
  2.   * Metoda sprawdza czy istnieją zmienne sesyjne - jeśli tak, to loguje usera w klasie
  3.   *
  4.   * @access public
  5.   * @return bool
  6.   */
  7. protected function isLoggin()
  8. {
  9. if($_SESSION['isLoggin'] == TRUE)
  10. {
  11. $this -> _isLoggin = $_SESSION['isLoggin'];
  12. $this -> _idSession = session_id();
  13. $this -> _email = $_SESSION['email'];
  14. return TRUE;
  15. }
  16. else
  17. {
  18. return FALSE;
  19. }
  20. }

5. Zbędny else
  1. if (1 == 1) {
  2. return true;
  3. }
  4. return false;

6. Przeczytaj co to SÓL, bo ta metoda nie ma z nią nic wspólnego
7. Po co ci statyczne metody?

Reszty już nie chce mi się sprawdzać - wszystko jest nie tak jak być powinno sad.gif

@edit a o hashowaniu hashó masz pogadankę w podczepionych

Ten post edytował CuteOne 31.07.2015, 21:53:09
Go to the top of the page
+Quote Post
michalboss
post 1.08.2015, 09:20:15
Post #4





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

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


Dzięki za odp - poprawię ten kod i dam jeszcze raz.
Nie rozumiem tylko punktu 2 oraz 6 - możesz rozwinąć?
Go to the top of the page
+Quote Post
Skie
post 1.08.2015, 13:55:48
Post #5





Grupa: Zarejestrowani
Postów: 555
Pomógł: 84
Dołączył: 20.02.2008
Skąd: Małopolska

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


2. Tutaj koledze chodziło o to, że nazwy metod jakie dobierasz odbiegają daleko od tego co dana metoda robi - np. isLoggin (lepsza nazwa to byłoby bodajże isLogged) sugeruje, że akcja sprawdza czy użytkownik jest zalogowany - tylko to. Twoja wersja z kolei jeszcze pod spodem robi własne logowanie, o czym nazwa metody nie mówi nic a nic.

6. Poczytaj o soli tutaj Temat: podwojne hashowanie hasel . Generalnie chodzi o to, że sól to pewny tajny string, którego używasz do konkatenacji z wpisanym przez użytkownika hasłem, by bronić się przed tęczowymi tablicami. Ta sól powinna być zahardkodowana gdzieś w kodzie Twojej aplikacji lub pobierana z jakichś plików źródłowych - nie powinna być trzymana w bazie danych koło hasła, bo wtedy skuteczność używania tej metody spada praktycznei do zera.


--------------------
Wieloprocesowość i wielowątkowość w PHP, poznaj Kraken PHP!
Serwer HTTP i WebSocket w PHP | Promise/A+
Strona Domowa | Elradia MMORPG
FireFox: make the web better.
Go to the top of the page
+Quote Post
Damonsson
post 1.08.2015, 14:32:38
Post #6





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


Cytat(Skie @ 1.08.2015, 14:55:48 ) *
Ta sól powinna być zahardkodowana gdzieś w kodzie Twojej aplikacji lub pobierana z jakichś plików źródłowych - nie powinna być trzymana w bazie danych koło hasła, bo wtedy skuteczność używania tej metody spada praktycznei do zera.

Jeżeli będzie zahardkodowana w kodzie, to będzie taka sama dla każdego usera i jej użyteczność bardzo mocno spadnie, w przypadku jej poznania. Znowu jeżeli będzie w bazie danych to będzie widoczna dla każdego hasła. Dlatego jestem zwolennikiem trzymania soli zarówno zahardkodowanej w kodzie jak i w bazie danych dla każdego hasła innej. Gdybym musiał wybierać nad tylko jednym sposobem trzymania soli, wybieram zdecydowanie opcję w bazie danych.
Go to the top of the page
+Quote Post
michalboss
post 1.08.2015, 18:51:37
Post #7





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

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


To chyba najlepiej podwójne hashowanie sola z bazy + solą ogólną dla systemu?
Go to the top of the page
+Quote Post
Pyton_000
post 1.08.2015, 18:58:44
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


A nie lepiej użyć jednego kodowania ale mocnego? Dajmy na to BlowFish, sha512 lub whirlpool ? Złamanie takiego hasła jest *nie możliwe (* nie możliwe w rozsądnym czasie)
Go to the top of the page
+Quote Post
Skie
post 1.08.2015, 20:29:07
Post #9





Grupa: Zarejestrowani
Postów: 555
Pomógł: 84
Dołączył: 20.02.2008
Skąd: Małopolska

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


Cytat
Dlatego jestem zwolennikiem trzymania soli zarówno zahardkodowanej w kodzie jak i w bazie danych dla każdego hasła innej.


Bez sensu trzymać sól w bazie danych, skoro używa się jej właśnie po to, by włamywacz nie był w stanie odszyfrować hasz haseł za pomocą tęczowych tablic po zdobyciu dostępu / zrzutu bazy danych aplikacji. Jest super mało prawdopodobne, że ktoś taki zdobędzie same hasze z bazy , ale soli już nie, dlatego tak jak pisałem - albo hardkodujemy sól w kodzie aplikacji albo pobieramy z zewnętrznego źródła. Polecam jednak hardkodować, bo jak w jakiś sposób stracisz sole wygenerowane dla pojedynczych użytkowników to będzie przeje.... smile.gif


--------------------
Wieloprocesowość i wielowątkowość w PHP, poznaj Kraken PHP!
Serwer HTTP i WebSocket w PHP | Promise/A+
Strona Domowa | Elradia MMORPG
FireFox: make the web better.
Go to the top of the page
+Quote Post
borabora
post 1.08.2015, 20:40:56
Post #10





Grupa: Zarejestrowani
Postów: 116
Pomógł: 33
Dołączył: 8.09.2014

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


Cytat(Skie @ 1.08.2015, 21:29:07 ) *
Bez sensu trzymać sól w bazie danych, skoro używa się jej właśnie po to, by włamywacz nie był w stanie odszyfrować hasz haseł za pomocą tęczowych tablic po zdobyciu dostępu / zrzutu bazy danych aplikacji.


nikt nie powiedział, że kod musi wyglądać tak:
  1. haszowanie($sol.$haslo)


sól z bazy możesz zmienić w skrypcie w sposób, w jaki Ci się podoba

Ten post edytował borabora 1.08.2015, 20:42:51
Go to the top of the page
+Quote Post
michalboss
post 1.08.2015, 21:11:23
Post #11





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

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


Trochę zmieniłem kod klasy - może to jest trochę bardziej prawidłowe od poprzedniego?
Jeśli chodzi o metody statyczne to zdefiniowałem je aby także użyć w innych klasach jak user -> rejestracja.

  1. <?php
  2.  
  3. class Login
  4. {
  5.  
  6. private $dbh;
  7. private $config;
  8. private $lang;
  9. private $isLogged = FALSE;
  10. private $idSession;
  11. private $email;
  12. private $idUser;
  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 checkLogged()
  28. {
  29. return $this->isLogged;
  30. }
  31.  
  32. /**
  33.   * Metoda sprawdza czy uzytkownik jest zalogowany (w klasie) - jeśli tak, to zapisuje dane z klasy do sesji
  34.   *
  35.   * @access public
  36.   * @return bool
  37.   */
  38. protected function setSessionData()
  39. {
  40. if($this->isLogged == TRUE)
  41. {
  42. $_SESSION['isLogged'] = $this->isLogged;
  43. $_SESSION['idUser'] = $this->idUser;
  44. $_SESSION['email'] = $this->email;
  45. }
  46. }
  47.  
  48. /**
  49.   * Metoda sprawdza czy uzytkownik jest zalogowany (sesję) - jeśli tak, to zapisuje dane z sesji do klasy
  50.   *
  51.   * @access public
  52.   * @return bool
  53.   */
  54. protected function getSessionData()
  55. {
  56. if(isset($_SESSION['isLogged']) && $_SESSION['isLogged'] == TRUE)
  57. {
  58. $this->isLogged = $_SESSION['isLogged'];
  59. $this->idUser = $_SESSION['idUser'];
  60. $this->email = $_SESSION['email'];
  61. $this->idSession = session_id();
  62. }
  63. }
  64.  
  65. /**
  66.   * Metoda logowania - sprawdza czy użytkownik nie jest już zalogowany i czy istnieją zmienne formularza logowania
  67.   * Jeśli tak, to sprawdza w bazie poprawność e-mail oraz hasła i dokonuje logowania w systemie
  68.   * Sprawdzana jest także ilość błędnych logowań - max 5 oraz czas od pierwszego błędnego logowania.
  69.   *
  70.   * @access public
  71.   * @return void
  72.   */
  73. public function userLogin()
  74. {
  75. $errorMsg = '';
  76. if(!($this->isLogged) && isset($_POST['logEmail']) && isset($_POST['logPassword']))
  77. {
  78. $sql = $this->dbh->prepare('SELECT A.IdUser, A.Email, A.Password, A.Salt, A.FirstName, A.LastName, A.ErrorLogin, A.ErrorLoginTime, A.Current '
  79. . 'FROM `users` A '
  80. . 'WHERE A.Email=:email LIMIT 1');
  81. $sql->bindValue(':email', $_POST['logEmail'], PDO::PARAM_STR);
  82. $sql->execute();
  83. if($sql->rowCount() > 0)
  84. {
  85. if($row = $sql->fetch())
  86. {
  87. $timeActual = strtotime(date("Y-m-d H:i:s"));
  88. $timeLogin = strtotime($row['ErrorLoginTime']);
  89. $timeCheck = $timeActual - $timeLogin;
  90. $timeCheckMin = round(60 - ($timeCheck / 60), 0);
  91.  
  92. if(self::decode($_POST['logPassword'], $row['Password']) == TRUE)
  93. {
  94. if($row['Current'] == 0)
  95. {
  96. $errorMsg = $this->lang['errorLoginCurrentError'];
  97. }
  98. else if($row['ErrorLogin'] >= 5 && ($timeCheck <= 3600))
  99. {
  100. $errorMsg = $this->lang['errorLoginTime'] . ' ' . $timeCheckMin . ' min.';
  101. }
  102. else
  103. {
  104. $this->isLogged = TRUE;
  105. $this->email = $row['Email'];
  106. $this->idUser = $row['IdUser'];
  107. $this->idSession = session_id();
  108. $this->setSessionData();
  109. if($row['ErrorLogin'] > 0 || $row['ErrorLoginTime'] != NULL)
  110. {
  111. $this->resetErrorLogin();
  112. }
  113. }
  114. }
  115. else
  116. {
  117. if($row['ErrorLogin'] >= 5 && ($timeCheck <= 3600))
  118. {
  119. $errorMsg = $this->lang['errorLoginTime'] . ' ' . $timeCheckMin . ' min.';
  120. }
  121. else
  122. {
  123. $this->updateErrorLogin($_POST['logEmail']);
  124. $errorMsg = $this->lang['errorLogin'];
  125. }
  126. }
  127. }
  128. }
  129. else
  130. {
  131. $this->updateErrorLogin($_POST['logEmail']);
  132. $errorMsg = $this->lang['errorLogin'];
  133. }
  134.  
  135. if(!empty($errorMsg))
  136. {
  137. throw new Exception($errorMsg);
  138. }
  139. }
  140. else if(!($this->isLogged) && isset($_SESSION['isLogged']) && $_SESSION['isLogged'] == TRUE)
  141. {
  142. $this->getSessionData();
  143. }
  144. }
  145.  
  146. /**
  147.   * Metoda resetuje ilośc błędów logowania oraz czas,
  148.   * dla użytkownika, w przypadku powodzenia logowania
  149.   *
  150.   * @access public
  151.   * @return void
  152.   */
  153. protected function resetErrorLogin()
  154. {
  155. $sql2 = $this->dbh->prepare('UPDATE `users` SET ErrorLogin = 0, ErrorLoginTime = NULL '
  156. . 'WHERE Email=:email');
  157. $sql2->bindValue(':email', $this->email, PDO::PARAM_STR);
  158. $sql2->execute();
  159. }
  160.  
  161. /**
  162.   * Metoda zwiększa ilośc błędnych logowań oraz zapisuje czas pierwszego błednego logowania
  163.   *
  164.   * @access public
  165.   * @return void
  166.   */
  167. protected function updateErrorLogin($logEmail)
  168. {
  169. $sql2 = $this->dbh->prepare('UPDATE `users` SET '
  170. . 'ErrorLogin = ErrorLogin+1, '
  171. . 'ErrorLoginTime = if(ErrorLoginTime IS NULL, \'' . date("Y-m-d H:i:s") . '\', ErrorLoginTime) '
  172. . 'WHERE Email=:email');
  173. $sql2->bindValue(':email', $logEmail, PDO::PARAM_STR);
  174. $sql2->execute();
  175. }
  176.  
  177. /**
  178.   * Metoda wylogowuje uzytkownika, niszczy sesję i usuwa dane
  179.   *
  180.   * @access public
  181.   * @return void
  182.   */
  183. public function userLogout()
  184. {
  185. unset($_SESSION);
  186. unset($this->isLogged);
  187. unset($this->idSession);
  188. unset($this->email);
  189. unset($this->idUser);
  190. header("Location: index.php?msg=logout");
  191. }
  192.  
  193. /**
  194.   * Metoda hashuje hasło używając podanej soli z kartoteki usera
  195.   *
  196.   * @access public
  197.   * @param string $Password
  198.   * @param string $Salt
  199.   * @return string
  200.   */
  201. public static function encode($password, $salt, $rounds = 10000)
  202. {
  203. // pass in the password, the number of rounds, and the salt
  204. // $5$ specifies SHA256-CRYPT, use $6$ if you really want SHA512
  205. return crypt($password, sprintf('$6$rounds=%d$%s$', $rounds, $salt));
  206. }
  207.  
  208. /**
  209.   * Metoda rozszyfrowuje podane hasło
  210.   *
  211.   * @access public
  212.   * @param string $Password
  213.   * @param string $Salt
  214.   * @return string
  215.   */
  216. public static function decode($password, $dbPassword)
  217. {
  218. // extract the hashing method, number of rounds, and salt from the stored hash
  219. // and hash the password string accordingly
  220. $parts = explode('$', $dbPassword);
  221. $testPassword = crypt($password, sprintf('$%s$%s$%s$', $parts[1], $parts[2], $parts[3]));
  222. return ($dbPassword === $testPassword) ? TURE : FALSE;
  223. }
  224.  
  225. /**
  226.   * Metoda tworzenia 16-znakowej soli
  227.   *
  228.   * @access public
  229.   * @return string
  230.   */
  231. public static function salt()
  232. {
  233. //return substr(hash('sha256', microtime() . substr($Password, 0, 3)), 0, 5);
  234. return substr(str_replace('+','.',base64_encode(md5(mt_rand(), true))),0,16);
  235. }
  236. }
  237. ?>
Go to the top of the page
+Quote Post
CuteOne
post 1.08.2015, 22:53:13
Post #12





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ę 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 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
michalboss
post 3.08.2015, 11:00:21
Post #13





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

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


Z tego co piszesz to rozumiem że lepiej zrobić zamiast:

  1. if($row['Current'] == 0)
  2. {
  3. $errorMsg = $this->lang['errorLoginCurrentError'];
  4. }
  5. else if($row['ErrorLogin'] >= 5 && ($timeCheck <= 3600))
  6. {
  7. $errorMsg = $this->lang['errorLoginTime'] . ' ' . $timeCheckMin . ' min.';
  8. }


to:

  1. if (!$this->checkCurrent())
  2. {
  3. throw new Exception($this->lang['errorLoginCurrentError']);
  4. }
  5.  
  6. if (!$this->checkErrorLoggin())
  7. {
  8. throw new Exception($this->lang['errorLoginTime'] . ' ' . $timeCheckMin . ' min');
  9. }


Czy taki zapis będzie lepszy od else if ?
Wtedy też likwiduje to ten dziwny zapis:
  1. if(!empty($errorMsg))
  2. {
  3. throw new Exception($errorMsg);
  4. }




Ten pierwszy potworek:
  1. else if(!($this->isLogged) && isset($_SESSION['isLogged']) && $_SESSION['isLogged'] == TRUE)

sprawdza czy user jest zalogowany (w klasie) i jeśli nie jest, a istnieją dane sesyjne to ma przypisać ich wartości do pól klasy.
Czy po prostu to powinien zrobić konstruktor - np sprawdzić przy tworzeniu obiektu czy są zmienne sesyjne i je przypisać?

Ten post edytował michalboss 3.08.2015, 11:22:19
Go to the top of the page
+Quote Post
marcio
post 3.08.2015, 12:15:59
Post #14





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

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


Jesli chcesz spojrz na moja klase do logowania nie jest to na pewno jakis super kod ale moze ci pomoc, tak jak widzisz klasa uzywa wiele innych bibliotek i jest podzielona na wiecej "czesci"
https://github.com/marcio199226/Volta-frame...ollers/auth.php


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
Pyton_000
post 3.08.2015, 12:50:24
Post #15





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


I jest równie fatalnie napisana co autora wątku.
Go to the top of the page
+Quote Post
marcio
post 3.08.2015, 18:06:58
Post #16





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

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


Cytat(Pyton_000 @ 3.08.2015, 13:50:24 ) *
I jest równie fatalnie napisana co autora wątku.

No skoro tak twierdzisz to pokaz twoja wink.gif


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
Pyton_000
post 3.08.2015, 18:55:57
Post #17





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


A kto powiedział że takową mam. Ja nie wymyślam koła na nowo wink.gif
Go to the top of the page
+Quote Post
audiodesign10
post 3.08.2015, 21:00:29
Post #18





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

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


Cytat(Damonsson @ 31.07.2015, 21:48:38 ) *
Żeby było szybciej napiszę co jest dobrze: nic. Nie jestem złośliwy w tym wypadku, uwierz. Może komuś będzie się chciało tłumaczyć, więc nie kasuj wątku.

Wygoogluj sobie: php oop example, php oop login example itp.



Witam,
więc prosiłbym abyś pokazał dobry przykład jak to się dokładnie robi, aby początkujący programiści nie musieli na przyszłość błądzić.

Pozdrawiam wink.gif
Go to the top of the page
+Quote Post
marcio
post 4.08.2015, 09:06:32
Post #19





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

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


Cytat(Pyton_000 @ 3.08.2015, 19:55:57 ) *
A kto powiedział że takową mam. Ja nie wymyślam koła na nowo wink.gif

Ja tez nie, uzywam rozne fw ale to mi nie przeszkadza w napisaniu czegos mojego w wolnym czasie skoro jestes taki dobry tylko w uzywaniu np symfony2 to po co sie odzywasz widze ze ostatnio na tym forum cos sie ludzia w glowkach popitolilo zejdzie na ziemie ludzie.


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
!*!
post 4.08.2015, 11:24:38
Post #20





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


Cytat(marcio @ 4.08.2015, 10:06:32 ) *
... widze ze ostatnio na tym forum cos sie ludzia w glowkach popitolilo zejdzie na ziemie ludzie ...


Niektórzy tak lubią, z lenistwem i stagnacją nie wygrasz. A co do dobrej klasy logowania, to praktycznie każdy FW ma takową w dokumentacji.


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 12.06.2025 - 22:25