wiki.phpfreakz.nl
Aanmelden Artikel Overleg Bewerk Geschiedenis Go to the site toolbox

Het Wiel Uitgevonden:Inloggen

--Taco 31 mrt 2010 23:58 (CEST)

DEZE TUTORIAL IS NOG IN DE MAAK!

Nu we bekend zijn met formulieren en de basis-principes van PHP, kunnen we een inlogsysteem gaan maken. Ik schakel hier over op Object Oriented Programming, hopelijk zie je dan ook direct hoeveel netter code daarvan kan worden.

de basics

Laten we ons eerst eens goed afvragen wat we precies willen. We willen dat als een bezoeker op de website komt, de website hem of haar "herkent". Zoals besproken in vorige tutorials hebben we daarvoor sessions tot onze beschikking.

We geven dus iedere gebruiker een sessie en slaan in de $_SESSION-array op of hij/zij ingelogd is. Dit is al een redelijk veilig systeem voor simpele sites. Om nu namelijk in te loggen onder iemand anders zijn/haar naam moet je de session_id van diegene hebben

<?php
session_start();
 
class Session {
 
	/*
	 *	Onze gebruikers en hun (versleutelde) wachtwoord.
	 *	Normaal zouden we deze liever ergens in bijvoorbeeld een database
	 *	stoppen, maar voor het gemak en overzicht zetten we ze nu hier
	 */
	protected $validUsers = array(
		'Henk' => '13265ff2119b023448a484a9236ef0e3',
		'Piet' => '6760f6eed78ae46a4a644badb1e3bfce',
		'Jan' => '16f169e5479ccec635d29af570f05618',
		'Klaas' => 'ed16e78fa3d3f08350020515e871ab6a',
		'Anne' => '8128160cb1d103a83aa4fa6627d63057',
		'Dirk' => 'f3d2f6cb1e291ab685e7d51088ee3e7d',
		'Bert' => 'bcfacb40627fb90f4453b0fa0629afd3',
	);
 
	/*
	 *	De functie waarmee je daadwerkelijk in kan loggen. Als de combinatie
	 *	user/pass klopt, worden de noodzakelijke gegevens in de $_SESSION
	 *	variabele geplaatst. Bij een foute combinatie wordt voor de zekerheid
	 *	de huidige gebruiker uitgelogd
	 */
	public function logIn( $username, $password ) {
		if ( isset($this->validUsers[$username]) and md5($password)==$this->validUsers[$username] ) {
			$_SESSION['loggedin'] = true;
			$_SESSION['username'] = $username;
			$_SESSION['ipadres'] = $_SERVER['REMOTE_ADDR'];
		}
		else {
			$this->logOut( );
		}
	}
 
	/*
	 *	Uitloggen is heel recht-toe recht-aan. Door de variabele
	 *	$_SESSION['loggedin'] weg te halen, zal ->loggedIn() false geven. We
	 *	ruimen ook de andere variabelen even op.
	 */
	public function logOut( ) {
		unset(
			$_SESSION['loggedin'],
			$_SESSION['username'],
			$_SESSION['ipadres']
		);
	}
 
	/*
	 * 	Hiermee kun je kijken of iemand ingelogd is. Om een geldige sessie te
	 *	hebben moet de gebruiker zowel ingelogd zijn als een correct IP-adres
	 *	hebben.
	 */
	public function loggedIn() {
		return
			isset($_SESSION['ipadres'], $_SESSION['loggedin']) and
			$this->correctIp( $_SESSION['ipadres'] ) and
			$_SESSION['loggedin'] == 'yes';
	}
 
	/*
	 *	Retourneert de naam van de huidige gebruiker. Als iemand niet ingelogd
	 *	is, noemen we hem 'Gast'.
	 */
	public function currentUser( ) {
		return $this->loggedIn( )
			? $_SESSION['username']
			: 'Gast';
	}
 
	/*
	 *	Aan een IP stellen we de eis dat de eerste drie van de vier octets
	 *	overeenkomen met het opgeslagen IP-adres. Dit bemoeilijkt session
	 *	hijacking, terwijl het mensen met een licht variƫrend IP niet
	 *	benadeeld worden.
	 */
	protected function correctIp( $ipAddress ) {
		$aParts1 = explode( '.', $_SERVER['REMOTE_ADDR'] );
		$aParts2 = explode( '.', $ipAddress );
		return
			$aParts1[0] == $aParts2[0] and
			$aParts1[1] == $aParts2[1] and
			$aParts1[2] == $aParts2[2];
	}
 
}
 
// Kleine hulpfunctie voor het testen
function reportStatus($session) {
	echo $session->currentUser() . ' is ';
	echo $session->loggedIn() ? 'wel' : 'niet';
	echo ' ingelogd<br />';
}
 
// Testen maar!
 
$session = new Session;
reportStatus($session);
// Gast is niet ingelogd
 
$session->logIn('Henk','wachtwoordHenk');
reportStatus($session);
// Henk is wel ingelogd
 
$session->logIn('Piet','wachtwoordPiet');
reportStatus($session);
// Piet is wel ingelogd
 
$session->logIn('Henk','foutwachtwoord');
reportStatus($session);
// Gast is niet ingelogd
 
$session->logIn('Anne','wachtwoordAnne');
reportStatus($session);
// Anne is wel ingelogd
 
$session->logOut();
reportStatus($session);
// Gast is niet ingelogd
?>

Site Toolbox:

Persoonlijke hulpmiddelen
De laatste wijziging op deze pagina vond plaats op 1 apr 2010 09:51. - Deze pagina werd 988 maal bekeken. - Disclaimers - Over PFZWIKI