Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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

Aktivity