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.
<?php
class Login
{
private $dbh;
private $config;
private $lang;
private $isLogged = FALSE;
private $idSession;
private $email;
private $idUser;
public function __construct($dbh, $config, $lang)
{
$this->dbh = $dbh;
$this->config = $config;
$this->lang = $lang;
}
/**
* Metoda sprawdza czy user jest zalogowany w systemie
*
* @access public
* @return bool
*/
public function checkLogged()
{
return $this->isLogged;
}
/**
* Metoda sprawdza czy uzytkownik jest zalogowany (w klasie) - jeśli tak, to zapisuje dane z klasy do sesji
*
* @access public
* @return bool
*/
protected function setSessionData()
{
if($this->isLogged == TRUE)
{
$_SESSION['isLogged'] = $this->isLogged;
$_SESSION['idUser'] = $this->idUser;
$_SESSION['email'] = $this->email;
}
}
/**
* Metoda sprawdza czy uzytkownik jest zalogowany (sesję) - jeśli tak, to zapisuje dane z sesji do klasy
*
* @access public
* @return bool
*/
protected function getSessionData()
{
if(isset($_SESSION['isLogged']) && $_SESSION['isLogged'] == TRUE) {
$this->isLogged = $_SESSION['isLogged'];
$this->idUser = $_SESSION['idUser'];
$this->email = $_SESSION['email'];
}
}
/**
* Metoda logowania - sprawdza czy użytkownik nie jest już zalogowany i czy istnieją zmienne formularza logowania
* Jeśli tak, to sprawdza w bazie poprawność e-mail oraz hasła i dokonuje logowania w systemie
* Sprawdzana jest także ilość błędnych logowań - max 5 oraz czas od pierwszego błędnego logowania.
*
* @access public
* @return void
*/
public function userLogin()
{
$errorMsg = '';
if(!($this->isLogged) && isset($_POST['logEmail']) && isset($_POST['logPassword'])) {
$sql = $this->dbh->prepare('SELECT A.IdUser, A.Email, A.Password, A.Salt, A.FirstName, A.LastName, A.ErrorLogin, A.ErrorLoginTime, A.Current '
. 'FROM `users` A '
. 'WHERE A.Email=:email LIMIT 1');
$sql->bindValue(':email', $_POST['logEmail'], PDO::PARAM_STR);
$sql->execute();
if($sql->rowCount() > 0)
{
if($row = $sql->fetch())
{
$timeLogin = strtotime($row['ErrorLoginTime']); $timeCheck = $timeActual - $timeLogin;
$timeCheckMin = round(60
- ($timeCheck / 60
), 0
);
if(self::decode($_POST['logPassword'], $row['Password']) == TRUE)
{
if($row['Current'] == 0)
{
$errorMsg = $this->lang['errorLoginCurrentError'];
}
else if($row['ErrorLogin'] >= 5 && ($timeCheck <= 3600))
{
$errorMsg = $this->lang['errorLoginTime'] . ' ' . $timeCheckMin . ' min.';
}
else
{
$this->isLogged = TRUE;
$this->email = $row['Email'];
$this->idUser = $row['IdUser'];
$this->setSessionData();
if($row['ErrorLogin'] > 0 || $row['ErrorLoginTime'] != NULL)
{
$this->resetErrorLogin();
}
}
}
else
{
if($row['ErrorLogin'] >= 5 && ($timeCheck <= 3600))
{
$errorMsg = $this->lang['errorLoginTime'] . ' ' . $timeCheckMin . ' min.';
}
else
{
$this->updateErrorLogin($_POST['logEmail']);
$errorMsg = $this->lang['errorLogin'];
}
}
}
}
else
{
$this->updateErrorLogin($_POST['logEmail']);
$errorMsg = $this->lang['errorLogin'];
}
{
throw new Exception($errorMsg);
}
}
else if(!($this->isLogged) && isset($_SESSION['isLogged']) && $_SESSION['isLogged'] == TRUE) {
$this->getSessionData();
}
}
/**
* Metoda resetuje ilośc błędów logowania oraz czas,
* dla użytkownika, w przypadku powodzenia logowania
*
* @access public
* @return void
*/
protected function resetErrorLogin()
{
$sql2 = $this->dbh->prepare('UPDATE `users` SET ErrorLogin = 0, ErrorLoginTime = NULL '
. 'WHERE Email=:email');
$sql2->bindValue(':email', $this->email, PDO::PARAM_STR);
$sql2->execute();
}
/**
* Metoda zwiększa ilośc błędnych logowań oraz zapisuje czas pierwszego błednego logowania
*
* @access public
* @return void
*/
protected function updateErrorLogin($logEmail)
{
$sql2 = $this->dbh->prepare('UPDATE `users` SET '
. 'ErrorLogin = ErrorLogin+1, '
. 'ErrorLoginTime = if(ErrorLoginTime IS NULL, \'' . date("Y-m-d H:i:s") . '\', ErrorLoginTime) ' . 'WHERE Email=:email');
$sql2->bindValue(':email', $logEmail, PDO::PARAM_STR);
$sql2->execute();
}
/**
* Metoda wylogowuje uzytkownika, niszczy sesję i usuwa dane
*
* @access public
* @return void
*/
public function userLogout()
{
header("Location: index.php?msg=logout"); }
/**
* Metoda hashuje hasło używając podanej soli z kartoteki usera
*
* @access public
* @param string $Password
* @param string $Salt
* @return string
*/
public static function encode
($password, $salt, $rounds = 10000) {
// pass in the password, the number of rounds, and the salt
// $5$ specifies SHA256-CRYPT, use $6$ if you really want SHA512
return crypt($password, sprintf('$6$rounds=%d$%s$', $rounds, $salt)); }
/**
* Metoda rozszyfrowuje podane hasło
*
* @access public
* @param string $Password
* @param string $Salt
* @return string
*/
public static function decode
($password, $dbPassword) {
// extract the hashing method, number of rounds, and salt from the stored hash
// and hash the password string accordingly
$parts = explode('$', $dbPassword); $testPassword = crypt($password, sprintf('$%s$%s$%s$', $parts[1
], $parts[2
], $parts[3
])); return ($dbPassword === $testPassword) ? TURE : FALSE;
}
/**
* Metoda tworzenia 16-znakowej soli
*
* @access public
* @return string
*/
{
//return substr(hash('sha256', microtime() . substr($Password, 0, 3)), 0, 5);
}
}
?>