Davs
"Sparre" <christian@NOSPAMsparre.it> wrote in news:vqFL8.39379
$4f4.1501777@news000.worldonline.dk:
> Meget gerne, det ville v‘re super
Ok - here goes. Jeg skal prøvet at holde tungen lige i munden, så
forklaringen herunder giver mening... (?) Koden hænger forneden.
På hver af mine sider include'res en header.php (og footer.php). I
header.php står følgende linier:
$cookie = new Cookie(USER_COOKIE); // USER_COOKIE er navnet på
kagen
$user = new User();
Cookie-constructoren parser den eksisterende USER_COOKIE hvis den findes
- den indeholder:
id - brugerens id i databasen
timestamp - timestamp for hvornår cookie er sat (det er også
skrevet i databasen)
ip - brugerens IP-adresse
password - brugerens kodeord i krypteret form
User-construktoren (hvis kaldt uden argument) går ind og henter brugeren
identificeret ved id i cookien.
På de beskyttede sider er indholdet pakket ind i en if-sætning:
if ( $user->authenticate() )
{
echo "du er en fin fætter, så du må se det hemmelige indhold";
}
else
{
echo "skrid, pomfrit!";
}
Authenticate går ind og checker den række i bruger-tabellen der er
identificeret ved id og sammenligner timestamp og kodeord. IP i cookien
checkes med maskinens IP. Hvis alt er ok kaldes metoden renewLogin(),
som sætter samme cookie igen blot med en nyt timestamp.
Hvis siderne ikke kræver login og der ikke er sat nogen kage, kommer
$cookie og $user bare til at indeholde nogle standardværdier.
Et par kommentarer:
1) User-klassen er en sub-klasse af Person, men denne gør for login-
systemets vedkommende ikke andet end at definere "hent bruger fra
databasen"-funktionen.
2) Syntaksen for et par funktioner:
SQL makeSQLSelect(select what, from table, where something)
SQL makeSQLUpdate(update table, set variables, where something)
Håber du kan få noget ud af det ellers må du sige til.
/Thomas
***** cookie.php:
<?php
class Cookie
{
var $name, $content_array, $expire;
function Cookie($name = "")
{
$this->name = $name;
$this->expire = 0;
if ( isset($_COOKIE[$name]) )
{
$old_cookie = $_COOKIE[$name];
if ( ENCODE_COOKIES )
{
$old_cookie = base64_decode
($old_cookie);
}
$old_cookie = unserialize(stripslashes
($old_cookie));
foreach ($old_cookie as $key => $value)
{
$this->add($key."=".$value);
}
}
else
{
$this->content_array = array();
}
}
function add()
{
foreach (func_get_args() as $cookie_var)
{
$key = strtok($cookie_var, "=");
$value = strtok("=");
$this->content_array[$key] = $value;
}
return $this->content_array;
}
function get($what)
{
$what = strtolower($what);
if ( isset($this->content_array[$what]) )
{
return $this->content_array[$what];
}
return false;
}
function set($expire = 0)
{
if ( $expire != 0 )
{
$this->expire = $expire;
}
$content = serialize($this->content_array);
if ( ENCODE_COOKIES )
{
$content = base64_encode($content);
}
return setcookie($this->name, $content, $this->
expire, "", "", 0);
}
function delete()
{
return setcookie($this->name, "", time() - 24 *
3600, "", "", 0);
}
}
?>
***** class_user.php:
<?php
require_once "class_person.php";
class User extends Person
{
var $authenticated;
function User($id = "")
{
global $cookie;
$this->Person();
$this->authenticated = false;
// Start with some defaults
$this->info_array = array(
"language" => DEFAULT_LANGUAGE,
"visibleitems" => DEFAULT_VISIBLE_ITEMS,
"logintimeout" => DEFAULT_LOGIN_TIMEOUT,
"experiencelevel" => DEFAULT_EXPERIENCE_LEVEL
);
// Get user on id given as argument or secondly on
id in cookie
$id = ( $id == "" ) ? $cookie->get("id") : $id;
if ( $id )
{
$this->getOnID($id);
}
}
function getOnLogin($login)
{
return $this->_getFromDatabase(makeSQLSelect("*",
"webusers", "login='".$login."'"));
}
function getOnID($id)
{
return $this->_getFromDatabase(makeSQLSelect("*",
"webusers", "id=".$id));
}
function _getFromDatabase($sql)
{
if ( parent::_getFromDatabase($sql) )
{
$this->_getPreferences();
return true;
}
return false;
}
function _getPreferences()
{
global $db;
$db->query(makeSQLSelect("*", "preferences", "id=".
$this->get("id")));
if ( $preferences = $db->fetchArray() )
{
foreach ($preferences as $preference =>
$value)
{
if ( !is_integer($preference) )
{
$this->set($preference, $value);
}
}
}
}
function authenticate()
{
global $cookie, $page, $debug_box;
// Authenticate user by comparing timestamps, IPs,
passwords and checking timeout
if ( !$this->authenticated )
{
if ( $this->get("timestamp") > ($cookie->get
("timestamp") - 30) )
{
if ( $this->get("timestamp") <
($cookie->get("timestamp") + 30) )
{
if ( time() < ($this->get
("timestamp") + $this->get("logintimeout")) )
{
if ( $this->get
("password") == $cookie->get("password") )
{
if ( $cookie->get
("ip") == getIP() )
{
$this->
renewLogin();
$this->
authenticated = true;
}
}
}
}
}
}
return $this->authenticated;
}
function login($login, $wanturl = "")
{
global $db, $url, $user_log;
if ( $this->getOnLogin($login) )
{
if ( crypt($_POST["password"], $this->get
("password")) == $this->get("password") )
{
$timestamp = time();
$db->query(
makeSQLUpdate("webusers",
"timestamp=".$timestamp, "id=".$this->get("id"))
);
$cookie = new Cookie(USER_COOKIE);
$cookie->add(
"id=".$this->get("id"),
"timestamp=".$timestamp,
"ip=".getIP(),
"password=".$this->get
("password")
);
$cookie->set(time() + $this->get
("logintimeout"));
$user_log->add(INFO, "Successful login:
".$login." => ".$_POST["password"]);
// Redirect?
$next_page = ( $wanturl != "" ) ?
$wanturl : $url->expand("welcome.php");
Header("Location: ".
$url->expand("redirect.php",
"wanturl=".urlencode($next_page))
);
exit;
}
}
$user_log->add(ERROR, "Failed login: ".$login." =>
".$_POST["password"]);
return false;
}
function renewLogin()
{
global $db, $cookie;
$timestamp = time();
$db->query(makeSQLUpdate("webusers", "timestamp=".
$timestamp, "id=".$this->get("id")));
$cookie = new Cookie(USER_COOKIE);
$cookie->add("timestamp=".$timestamp);
$cookie->set(time() + $this->get("logintimeout"));
}
}
?>