Authentication Class
Ik ben sinds een paar maand me gaan verdiepen in OOP. Het probleem waar ik eigelijk tegen aanliep is: 'Doe ik het nou eigelijk wel goed?' Kan iemand mij vertellen over aan mijn class nog ogen of haken zitten? Verder zijn alle opmerkingen/verbeteringen uiteraard welkom. Bugfix: - 2x htmlspecialchars vervangen door mysql_real_escape_string Update 1.01: - Login methode verranderd, er word nu 1 saltkey aangemaakt voor alle gebruikers. Letop chmod werkt niet (volledig?) onder windows. Dus onder windows is het mogelijk om de salt.key te lezen. Als je gebruik maakt van een linux server: Dan niet. - verifyPassword verwijderd. Er word pas data opgehaald als wachtwoord+gebruikersnaam correct is. Update Versie 1.10: - Nieuwe functie "setRequiredAuth" hiermee kun je een bepaald gebruiker niveau van de gebruiker eisen. Op dit moment geeft hij een een 'hard' exit. Met userlevels eventueel zelf uit database halen. Voorbeeld gegeven. - Exceptions ipv eigen error handler - PDO ipv mysql_error; - Code optimalisatie Update 1.11: - ipadress veranderd naar ip_adress (typo) - Groter ipv Kleiner hakje - ($this->m_aUserdata = $aSql ;) => ($this->m_aUserdata = $aSql;) Deze fout zat er in omdat ik iets te snel ben wisselt naar PDO. [met dank aan Ron voor het vinden van deze fouten] Todo: - Goede oplossing vinden voor saltkeys onder windows. (chmod werkt niet namelijk, dus het bestand is gewoon te opnenen. - setRequiredAuth opties toevoegen (redirecten naar login pagina bijvoorbeeld)
Database Layout:
CREATE TABLE `gebruikers` (
`gebruikerid` int(6) NOT NULL auto_increment,
`gebruikersnaam` varchar(50) NOT NULL,
`voornaam` varchar(40) NOT NULL,
`tussenvoegsel` varchar(25) NOT NULL,
`achternaam` varchar(40) NOT NULL,
`wachtwoord` varchar(40) NOT NULL,
`niveau` int(6) NOT NULL,
PRIMARY KEY (`gebruikerid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
Database Connect('config.php')
<?php
session_start();
//Userlevels:
define('BANNED', 0);
define('QUEST', 1);
define('USER', 2);
define('VIP', 3);
define('REDACTEUR', 4);
define('MODERATOR', 5);
define('SUPERMODERATOR', 6);
define('ADMIN', 7);
include('clsAuthentication.php');
$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
try
{
$Auth = new Authentication($db);
}
catch(Exception $e)
{
echo 'Message: ' .$e->getMessage();
}
?>
Voorbeeld('index.php');
<?php
include('config.php');
$Auth->setRequiredAuth(QUEST);
$Auth->login('Gebruikersnaam', 'Wachtwoord');
?>
Classe ('clsAuthentication.php')
<?php
class Authentication
{
static $db;
private $m_sSaltkey;
protected $m_aUserdata = array();
function __construct($p_oDatabaseConnection)
{
if(is_object($p_oDatabaseConnection))
{
$this->db = $p_oDatabaseConnection;
}
else
{
throw new Exception('Geen database Connection ?');
exit;
}
$this->getLoginStatus();
}
public function login($p_sUsername, $p_sPassword)
{
$p_sUsername = $this->db->quote($p_sUsername);
$p_sPassword = $this->db->quote($p_sPassword);
if(!isset($_SESSION['user_id']))
{
if($this->getUserdata($p_sUsername, $p_sPassword))
{
$_SESSION['login_time'] = time();
$_SESSION['user_id'] = $this->m_aUserdata['gebruikerid'];
$_SESSION['server_generated'] = true;
$_SESSION['username'] = $this->m_aUserdata['gebruikersnaam'];
$_SESSION['ip_adress'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
$_SESSION['auth_lvl'] = $this->aUserdata['niveau'];
}
}
else
{
throw new Exception('Je bent al ingelogd');
}
}
private function validateSession()
{
if(($_SERVER['REMOTE_ADDR'] != $_SESSION['ip_adress']) or ($_SERVER['HTTP_USER_AGENT'] != $_SESSION['user_agent']) or empty($_SESSION['server_generated']))
{
$this->logout();
throw new Exception('Sessie informatie corrupt');
return false;
}
return true;
}
private function getLoginStatus()
{
if(isset($_SESSION['user_id']))
{
if($this->validateSession())
{
return true;
}
}
return false;
}
function setRequiredAuth($p_nRequired)
{
if($this->getLoginStatus())
{
if($_SESSION['auth_lvl'] < $p_nRequired)
{
echo 'Je hebt niet genoeg rechten om hier te mogen komen';
exit;
}
}
else
{
if($p_nRequired > 1)
{
echo 'Je moet ingelogd zijn en de benodigede rechten hebben om hier te mogen komen';
exit;
}
}
return true;
}
private function getSaltkey()
{
if(is_file("salt.key") and is_readable("salt.key"))
{
$filePointer = fopen('salt.key', 'r');
$this->m_sSaltkey = fread($filePointer, 40);
fclose($filePointer);
}
else
{
$filePointer = fopen('salt.key', 'w+');
$aRange = range('A', 'z');
shuffle($aRange);
$sSaltkey = sha1(implode('', $aRange));
fwrite($filePointer, $sSaltkey);
chmod('salt.key', 660);
$this->getSaltkey(); //recall it self to load 'new'
}
}
private function getUserdata($p_sUsername, $p_sPassword)
{
$aSql = $this->db->query("
SELECT *
FROM gebruikers
WHERE LOWER(gebruikersnaam) = LOWER('".$p_sUsername."') AND wachtwoord = '".sha1(sha1($p_sPassword).$this->m_sSaltkey)."'
LIMIT 1");
if(!is_null($aSql))
{
$this->m_aUserdata = $aSql;
}
else
{
throw new Exception('Gebruikersnaam of Wachtwoord fout');
return false;
}
return true;
}
public function logout()
{
if(isset($_SESSION['user_id']))
{
session_destroy();
return true;
}
throw new Exception('Je kunt niet uitloggen als je niet bent ingelogd');
return false;
}
}
?>
Reacties
0