Voici le fichier la classe que j'utilise dans les scripts que je développe ($DB_site est ma couche d'accès à la base de données, $rooturl est l'URL de base du site, $sitename est le nom du site utilisé pour crypter le mot de passe, $sitemembercpdir est le lien vers la zone membres) :
PHP Code:
<?php
error_reporting(E_ALL & ~E_NOTICE);
class Auth
{
var $username = '';
var $password = '';
function auth_check()
{
global $_SESSION, $DB_site, $rooturl;
session_name('auth');
session_start();
if(isset($_SESSION['id']))
{
$session_id = $_SESSION['id'];
$session_lastactivity = intval($_SESSION['lastactivity']);
if ($session_id == md5(intval($_SESSION['userid']) . $_SESSION['username'] . $session_lastactivity))
{
$result = $DB_site->query("SELECT * FROM session WHERE sessionid = '" . $session_id ."'");
if ($DB_site->num_rows($result) == 1)
{
$current_time = time();
$DB_site->query("UPDATE session SET lastactivity = " . $current_time . " WHERE sessionid = '" . $session_id ."'");
$DB_site->query("UPDATE user SET lastactivity = " . $current_time . " WHERE userid = '" . intval($_SESSION['userid']) ."'");
$past = time() - 3600;
$DB_site->query("DELETE FROM session WHERE lastactivity < '" . $past . "'");
}
else
{
header("Location:" . $rooturl . "/index.php");
exit;
}
}
}
else
{
header("Location:" . $rooturl . "/index.php");
exit;
}
}
function auth_login()
{
global $_SESSION, $DB_site, $rooturl, $sitename, $sitemembercpdir;
$enc_pass = md5(md5(trim($this->password)).$sitename);
$result = $DB_site->query("SELECT * FROM user WHERE username = '" . trim($this->username) . "'");
if ($DB_site->num_rows($result) == 1)
{
$row = $DB_site->fetch_array($result);
if ($row['password'] == $enc_pass)
{
session_name('auth');
session_start();
$current_time = time();
$session_id = md5($row['userid'] . $row['username'] . $current_time);
$DB_site->query("DELETE FROM session WHERE userid = '" . $row['userid'] . "'");
$DB_site->query("INSERT INTO session (sessionid, userid, lastactivity) VALUES ('" . $session_id . "', '" . $row['userid'] . "', '" . $current_time . "')");
$DB_site->query("UPDATE user SET lastactivity = " . $current_time . " WHERE userid='" . $row['userid'] ."'");
$_SESSION['id'] = $session_id;
$_SESSION['userid'] = $row['userid'];
$_SESSION['username'] = trim($this->username);
$_SESSION['lastactivity'] = $current_time;
session_write_close();
{
header("Location:" . $rooturl . $sitemembercpdir . "/index.php");
exit;
}
}
else
{
header("Location:" . $rooturl . "/index.php");
exit;
}
}
else
{
header("Location:" . $rooturl . "/index.php");
exit;
}
}
function auth_logout()
{
global $_SESSION, $DB_site, $rooturl;
session_name('auth');
session_start();
$current_time = time();
$DB_site->query("UPDATE user SET lastactivity = '" . $current_time . "' WHERE userid = '" . intval($_SESSION['userid']) ."'");
$DB_site->query("DELETE FROM session WHERE userid = '" . $_SESSION['userid'] . "'");
session_unregister('id');
session_unregister('userid');
session_unregister('username');
session_unregister('lastactivity');
if (session_register('id'))
{
session_destroy();
}
if (session_register('userid'))
{
session_destroy();
}
if (session_register('username'))
{
session_destroy();
}
if (session_register('lastactivity'))
{
session_destroy();
}
header("Location:" . $rooturl . "/index.php");
exit;
}
}
?>
Sur les pages nécessitant une identification :
PHP Code:
require_once('./includes/auth.php');
$auth = new Auth;
$auth->auth_check();
Sur la page de login ($username et $password ont été passés par un formulaire et, bien sûr, vérifiés comme ne contenant pas de caractère frauduleux) :
PHP Code:
require_once('./includes/auth.php');
$auth = new Auth;
$auth->username = $username;
$auth->password = $password;
$auth->auth_login();
Côté MySQL, j'ai ça (la clé sur userid n'est pas indispensable je pense) :
Code:
CREATE TABLE `session` (
`sessionid` varchar(50) NOT NULL default '',
`userid` int(10) unsigned NOT NULL default '0',
`lastactivity` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`sessionid`),
KEY `userid` (`userid`)
) TYPE=HEAP;
Avec tout ça tu devrais arriver à faire quelque chose de pas trop mal je pense