DevbookMVC
autentifikace a autorizace
php
<?php
// Třída poskytuje funkcionalitu pro práci s uživateli
class UserManager
{
// Sůl pro zabezpečení hesla
const SALT = "e#@$#€fdgehtegfdssw";
// Vytvoří nového uživatele systému
public function createUser($email, $nick, $password)
{
$result = DB::querySingle('SELECT COUNT(*) FROM `uzivatele` WHERE `email` = ?', array($email));
if (!$result)
{
$usr = array(
'email' => $email,
'prezdivka' => $nick,
'heslo' => $this->passwordHash($password),
);
DB::insert('uzivatele', $usr);
return true;
}
return false;
}
// Změní uživateli heslo
public function changePassword($id, $oldPassword, $newPassword)
{
$oldDBPassword = DB::querySingle('SELECT `heslo` FROM `uzivatele` WHERE `uzivatele_id` = ?', array($id));
if ($oldDBPassword == $this->passwordHash($oldPassword))
{
$usr = array(
'heslo' => $this->passwordHash($newPassword),
);
DB::update('uzivatele', $usr, 'WHERE `uzivatele_id` = ?', array($id));
}
return false;
}
// Přihlásí uživatele pomocí emailu a hesla
public function login($email, $password, $permanent)
{
// Zjištění údajů z databáze
$data = DB::queryOne('SELECT `heslo`, `uzivatele_id` FROM `uzivatele` WHERE `email` = ?', array($email));
// údaje sedí
if (($data) && ($this->passwordHash($password) == $data['heslo']))
{
// Získání autentifikačního hashe
$authHash = $this->authHash($data['uzivatele_id'], $data['heslo']);
// Založení relace pro uživatele
$this->createRelation($data['uzivatele_id'], $authHash);
// Trvalé přihlášení
if ($permanent)
setcookie("auth", 'id=' . $data['uzivatele_id'] . '&hash=' . $authHash, time() + (3600 * 24 * 365), '/');
// na produkci je vhodné doplnit další argument: '.domena.cz'
return true;
}
return false;
}
// Provede automatické přihlášení pomocí cookie, při úspěchu vrátí ID přihlášeného uživatele
public function autoLogin()
{
if (isset($_COOKIE["auth"])) {
// vytvoří proměnné $id a $hash z cookie
parse_str($_COOKIE["auth"]);
$password = DB::querySingle('SELECT `heslo` FROM `uzivatele` WHERE `uzivatele_id` = ?', array($id));
// údaje sedí
if (($password) && ($this->authHash($id, $password) == $hash))
{
$this->createRelation($id, $hash);
return $id;
}
}
return false;
}
// Odhlásí uživatele
public function logout()
{
unset($_SESSION['identity']);
// zneaktivnění cookie
setcookie("auth", '', time() - (3600 * 24 * 365), '/');
// na produkci je vhodné doplnit další argument: '.domena.cz'
}
// Zjistí, zda je uživatel přihlášen, případně vrátí jeho ID
public function logged()
{
if (isset($_SESSION['identity']))
{
// Kontrola hashe proti podstrčení SESSION
$id = $_SESSION['identity']['id'];
$password = DB::querySingle('SELECT `heslo` FROM `uzivatele` WHERE `uzivatele_id` = ?', array($id));
if ($_SESSION['identity']['hash'] == $this->authHash($id, $password))
return $_SESSION['identity']['id'];
}
return false;
}
// Vytvoří relaci pro uživatele, která na serveru vydrží i po ukončení spojení
private function createRelation($id, $hash)
{
$_SESSION['identity'] = array(
'id' => $id,
'hash' => $hash,
);
}
// Vrátí otisk (hash) hesla
private function passwordHash($password)
{
return hash('sha512', $password . self::SALT);
}
// Vrátí autentifikační hash pro trvalé přihlášení
private function authHash($userId, $password)
{
// Kontrolujeme IP adresu, zda souhlasí s tou, ze které se uživatel zalogoval
return hash('sha512', self::SALT . $userId . $_SERVER['REMOTE_ADDR'] . $password);
}
}
Neformátovaný
Přidáno: 18.12.2012
Expirace: Neuvedeno