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.
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