Scripts

Simple Auth Class

Simpele Auth Class Benodigdheden: + PHP5 + PDO (Eventueel aan te passen) + PHP-kennis (deze class maakt alleen het maken van een inlogsysteem makkelijker) + MySQL Database (dit script heeft 1 tabel nodig, sql dump is meegeleverd) Functies: + login(username, wachtwoord) Inloggen met de gebruikersnaam en wachtwoord als parameters + logout() Uitloggen + isLoggedIn() Returnt een boolean of de gebruiker is ingelogd + getId Returnt het id van de ingelogde gebruiker (indien aanwezig) + getName Returnt de gebruikersnaam van de ingelogde gebruiker (indien aanwezig) Veiligheid: + Wachtwoord wordt niet opgeslagen, in sessie / cookie + Wachtwoord gehasht opgeslagen in de database + Controle op IP + Controle op User-Agent + Maar 1 gebruiker tegelijk op 1 account Opmerkingen: + Dit is dus geen compleet inlog systeem, de inlog formulieren, wachtwoordherstel functie, en registratie functie zul je zelf nog moeten maken. Gebruik: + Voer de sql uit het bestand 'auth.sql' uit in de database + Wijzig 'const COOKIE_DOMAIN' op regel 12 van 'Auth.php' naar jouw domein + Voeg een nieuwe gebruiker toe in de database, hash het wachtwoord wel eerst met sha1(). + Bouw het in jouw script in, bekijk ook het voorbeeld: index.php.

simple-auth-class
Auth.php
[code]
<?php
/**
* Simple Auth class
* @package Auth
* @author Mark Pieper
*/
class Auth {
	
	/**
	* Het domein waarop je cookies moeten werken
	*/
	const COOKIE_DOMAIN = '.localhost.test';

	/**
	* Tabel met gebruikers in
	*/
	protected $_table = 'users';	
	
	/**
	* PDO object
	*/
	protected $_pdo = null;
	
	/**
	* Of de gebruiker is ingelogd (null = onbekend, true = ja, false = nee)
	*/
	protected $_loggedIn = null;
	
	/**
	* User id (0 = onbekend)
	*/
	protected $_userId = 0;
	
	/**
	* User name
	*/
	protected $_userName = null;
	
	/**
	* Constructor
	* @param $pdo PDO object
	*/
	public function __construct(PDO $pdo) {
		
		$this -> _pdo = $pdo;
		
	}
	
	/**
	* Destructor
	*/
	public function __destruct() {
		
		// Eventueel de PDO connectie afsluiten
		
		
	}
	
	/**
	* getId
	* @return (string) Id van de ingelogde gebruiker
	*/
	public function getId() {
		
		return $this -> _userId;
		
	}
	
	/**
	* getName
	* @return (string) Gebruikersnaam van de ingelogde gebruiker
	*/
	public function getName() {
		
		return $this -> _userName;
		
	}
	
	/**
	* Login
	* @param $user (string) De gebruikersnaam
	* @param $pass (string) Het wachtwoord
	* @return (bool) Succesvol ingelogd
	*/
	public function login($name, $pass) {
		// Password hashen
		$hashedPass = sha1($pass);
		
		// Query samenstellen
		$query = 'SELECT id FROM '.$this -> _table.' WHERE name = \''.$name.'\' AND pass = \''.$hashedPass.'\' LIMIT 1';
		// Query uitvoeren
		$queryResult = $this -> _pdo -> query($query); 
		// Alleen het userId word gevraagd
		$userId = $queryResult -> fetchColumn();
		// Kijken of er een geldig userId word terug gevraagd
		if(ctype_digit($userId)) {
			// Hash maken
			$hash = sha1($userId . $_SERVER['HTTP_USER_AGENT']);
			// Cookies zetten
			setcookie('user_id', $userId, time() + 60*60*24*365, '/', self::COOKIE_DOMAIN);
			setcookie('user_hash', $hash, time() + 60*60*24*365, '/', self::COOKIE_DOMAIN);			
			// Update query samenstellen, ip en hash updaten
			$query = 'UPDATE '.$this -> _table.' SET hash = \''.$hash.'\', ip = \''.$_SERVER['REMOTE_ADDR'].'\' WHERE id = \''.$userId.'\'';
			// Query uitvoeren
			if(!$this -> _pdo -> query($query) -> rowCount() === 1) {
				// Als de query niet lukt exception gooien
				throw new PDOException($this -> _pdo -> errorInfo());
				
			}
			// Gebruiker heeft een geldig wachtwoord gebruikt, alle gegevens opslaan
			$this -> _userId = $userId;
			$this -> _userName = $name;
			$this -> _loggedIn = true;
			return true;
			
		}
		
		else
		
		{
			
			return false;
			
		}		
		
	}
	
	/**
	* Logout
	* @return (bool) Succesvol uitgelogd
	*/
	public function logout() {
		// Cookies verwijderen
		setcookie('user_id', 0, time() - 3600, '/', self::COOKIE_DOMAIN);
		setcookie('user_hash', '', time() - 3600, '/', self::COOKIE_DOMAIN);			
		// Update query samenstellen, ip en hash updaten
		$query = 'UPDATE '.$this -> _table.' SET hash = NULL, ip = \''.$_SERVER['REMOTE_ADDR'].'\' WHERE id = \''.$this -> _userId.'\'';
		// Variablen opnieuw instellen
		$this -> _loggedIn = false;
		$this -> _userId = 0;
		$this -> _userName = null;
		
		return true;
		
	}
	
	/**
	* isLoggedIn
	* @return (bool) Of de gebruiker is ingelogd
	*/
	public function isLoggedIn() {
		// Gebruiker is ingelogd
		if($this -> _loggedIn === true) {
			
			return true;
			
		}
		// Gebruiker is (al gecontroleerd) niet ingelogd
		elseif($this -> _loggedIn === false) {
			
			return false;
			
		}
		// Het is onbekend of de gebruiker is ingelogd, achterhaal dit nu
		else {
			
			return $this -> _isLoggedIn();
			
		}
		
	}
	
	/**
	* _isLoggedIn
	* @return (bool) Of de gebruiker is ingelogd
	*/
	protected function _isLoggedIn() {
		// Kijken of er cookies zijn gezet, en controleren of ze valid zijn
		if(isset($_COOKIE['user_id']) && ctype_digit($_COOKIE['user_id']) && isset($_COOKIE['user_hash']) && ctype_alnum($_COOKIE['user_hash'])) {
			
			$query = 'SELECT name FROM '.$this -> _table.' WHERE id = \''.$_COOKIE['user_id'].'\' AND hash = \''.$_COOKIE['user_hash'].'\' AND ip = \''.$_SERVER['REMOTE_ADDR'].'\'  LIMIT 1';
			// Query uitvoeren
			$queryResult = $this -> _pdo -> query($query); 
			// Alleen het userName word gevraagd
			$userName = $queryResult -> fetchColumn();
			// Kijken of de username word terug gegeven
			if(ctype_alnum($userName)) {
				// Controleren of de hash ook klopt (browsercheck)
				if(sha1($_COOKIE['user_id'] . $_SERVER['HTTP_USER_AGENT']) === $_COOKIE['user_hash']) {
					// Ingelogd, alles opslaan
					$this -> _loggedIn = true;
					$this -> _userId = $_COOKIE['user_id'];
					$this -> _userName = $userName;
					return true;
				}
				// Browser is veranderd
				else
				
				{
					// Niet ingelogd
					$this -> _loggedIn = false;
					// Cookies verwijderen
					setcookie('user_id', 0, time() - 3600, '/', self::COOKIE_DOMAIN);
					setcookie('user_hash', '', time() - 3600, '/', self::COOKIE_DOMAIN);		
					return false;
					
				}
				
			}		
			
		}
		// Geen geldige cookies gezet
		else
		
		{
			// Niet ingelogd
			$this -> _loggedIn = false;
			return false;
			
		}		
		
	}
	
}
?>
[/code]

auth.sql:
[code]CREATE TABLE `test`.`users` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR( 50 ) NOT NULL ,
`pass` VARCHAR( 40 ) NOT NULL ,
`hash` VARCHAR( 40 ) NOT NULL ,
`ip` VARCHAR( 15 ) NOT NULL ,
PRIMARY KEY ( `id` )
UNIQUE (
`name` 
)
) ENGINE = MYISAM
 [/code] 

Voorbeeldje:
[code]<?php
error_reporting(E_ALL | E_STRICT);
require 'Auth.php';

$auth = new Auth(new PDO('mysql:host=localhost;dbname=test' , 'root' , ''));

if($_SERVER['REQUEST_METHOD'] == 'POST') {
	
	if(isset($_POST['user']) && ctype_alnum($_POST['user']) && isset($_POST['pass'])) {
		
		if($auth -> login($_POST['user'], $_POST['pass'])) {
			
			// Gebruiker is ingelogd, een bericht niet nodig, want de derde parameter geeft aan dat hij direct moet worden doorgestuurd		
			echo 'ingelogd';
			echo '<a href="'.basename(__FILE__).'?logout">Loguit</a>';	
			
		}
		
		else
		
		{
			
			echo 'Geen geldige gebruikersnaam / wachtwoord ingevuld.';
			
		}
		
	}
	
	else
	
	{
		
		echo 'Geen geldige gebruikersnaam / wachtwoord ingevuld.';
		
	}
	
}

elseif(isset($_GET['logout'])) {
	
	$auth -> logout();
	
	echo 'Uitgelogd';
	
}

elseif($auth -> isLoggedIn()) {

	echo 'U bent ingelogd.';
	
}


else {
	
	echo 'Login: <br />';
	echo '<form method="post" action="'.basename(__FILE__).'">';
	echo '<input type="text" id="user" name="user" value="Gebruikersnaam" />';
	echo '<input type="text" id="pass" name="pass" value="Wachtwoord" />';
	echo '<input type="submit" id="submit" name="submit" value="Login!" />';
	echo '</form>';
}
?> [/code] 

Reacties

0
Nog geen reacties.