Hallo,
ich habe folgende Login-Klasse erstellt, ist allerdings so ziemlich das erst OOP-Projekt. Deswegen möchte ich die Erfahrenen mal bitten, sich die Klasse anzusehen und Tipps zu geben.
Ausserdem hab ich noch ein Problem:
Die Funktion checkProfile() soll in der Funktion checkUser() nur dann ausgeführt werden, wenn bei der Funktion loginUser() der Parameter $profile gesetzt wurde. Allerdings weis ich nicht, wie ich herausfinden soll, dass dieser gesetzt wurde, ausser über ne Session-Variable oder ne include-Datei, was ich allerdings für nicht elegant gelöst halte. Zu prüfen ob der Paramter $autologin gesetzt wurde ist ja nicht schwer, da muss man ja nur prüfen, ob ein Cookie gesetzt ist.
Hier der Code:
Hab bei jeder Funktion noch den Rückgabewert dabei, obwohl nur der von den Funktionen loginUser(), checkUser() und logoutUser() benötigt wird. Habe das noch drin, weil ich gerne prüfen wollte, ob die Funktionen auch richtig ausgeführt wurden. Da wäre es doch angebracht Exceptions zu benutzen, falls die Funktionen nicht richtig ausgeführt werden, oder?
Hoffe ihr könnt mir helfen.
MfG,
ill-maestro
ich habe folgende Login-Klasse erstellt, ist allerdings so ziemlich das erst OOP-Projekt. Deswegen möchte ich die Erfahrenen mal bitten, sich die Klasse anzusehen und Tipps zu geben.
Ausserdem hab ich noch ein Problem:
Die Funktion checkProfile() soll in der Funktion checkUser() nur dann ausgeführt werden, wenn bei der Funktion loginUser() der Parameter $profile gesetzt wurde. Allerdings weis ich nicht, wie ich herausfinden soll, dass dieser gesetzt wurde, ausser über ne Session-Variable oder ne include-Datei, was ich allerdings für nicht elegant gelöst halte. Zu prüfen ob der Paramter $autologin gesetzt wurde ist ja nicht schwer, da muss man ja nur prüfen, ob ein Cookie gesetzt ist.
Hier der Code:
PHP-Code:
<?php
class user
{
protected $db;
protected $u_id;
protected $u_name;
protected $u_pw;
protected $profile;
//SESS starten und DB_CONN angeben und angeben nach welcher Zeit (Min.) automatisch ausgeloggt werden soll
public function __construct($db, $logout_time = 15, $profile = false)
{
session_start();
$this->db = $db;
$this->autoLogout($logout_time);
$this->profile = $profile;
}
//NAME und PW mit DB vergleichen
public function loginUser($u_name, $u_pw, $autologin = false)
{
$this->u_name = $u_name;
$this->u_pw = $u_pw;
$sql = 'SELECT
id
FROM
user
WHERE
name = "' .$this->db->real_escape_string($this->u_name). '"
AND
pw = SHA1("' .$this->db->real_escape_string($this->u_pw). '")';
$result = $this->db->query($sql);
$row = $result->fetch_assoc();
$this->u_id = $row['id'];
if ($result->num_rows == 1) {
$_SESSION['u_id'] = $this->u_id;
$_SESSION['u_name'] = $this->u_name;
if ($this->profile) {
$this->loginProfile();
}
if ($autologin) {
$this->setAutologin();
}
return true;
} else {
return false;
}
}
//PROFIL aktualisieren (einloggen)
protected function loginProfile()
{
$sql = 'UPDATE
user
SET
sess_id = "' .session_id(). '",
last_action = NOW(),
last_login = NOW()
WHERE
id = "' .$this->u_id. '"';
$result = $this->db->query($sql);
return $result;
}
//AUTOLOGIN aktivieren
protected function setAutologin()
{
$autologin_id = sha1(mt_rand().$_SERVER['REMOTE_ADDR'].microtime());
setCookie('autologin', $autologin_id, time()+60*60*24*365);
$sql = 'UPDATE
user
SET
autologin = "' .$autologin_id. '"
WHERE
id = "' .$this->u_id. '"';
$result = $this->db->query($sql);
return $result;
}
//SESS zerstören
public function logoutUser()
{
if ($this->profile) {
$this->logoutProfile();
}
if (isset($_COOKIE['autologin'])) {
$this->unsetAutologin();
}
if (session_unregister('u_id') && session_unregister('u_name')) {
return true;
} else {
return false;
}
}
//PROFIL aktualisieren (ausloggen)
protected function logoutProfile()
{
$sql = 'UPDATE
user
SET
sess_id = NULL,
autologin = NULL
WHERE
id = "'.$_SESSION['u_id'].'"';
$result = $this->db->query($sql);
return $result;
}
//AUTOLOGIN deaktivieren
protected function unsetAutologin()
{
$sql = 'UPDATE
user
SET
autologin = NULL
WHERE
id = "'.$_SESSION['u_id'].'"';
$result = $this->db->query($sql);
return setCookie('autologin', '', time()-60*60);
}
//Prüfen ob USER eingeloggt ist
public function checkUser()
{
if (isset($_SESSION['u_id'], $_SESSION['u_name'])) {
if ($this->profile) {
$this->loginProfile();
}
return true;
} else if (isset($_COOKIE['autologin'])) {
return $this->checkCookie();
} else {
return false;
}
}
//Prüfen ob COOKIE gesetzt ist
protected function checkCookie()
{
$sql = 'SELECT
id, name
FROM
user
WHERE
autologin = "' .$this->db->real_escape_string($_COOKIE['autologin']). '"';
$result = $this->db->query($sql);
$row = $result->fetch_assoc();
$this->u_id = $row['id'];
$this->u_name = $row['name'];
if ($result->num_rows == 1) {
$_SESSION['u_id'] = $this->u_id;
$_SESSION['u_name'] = $this->u_name;
return $this->checkUser();
}
}
//PROFIL aktualisieren (eingeloggt)
protected function checkProfile()
{
$sql = 'SELECT
sess_id
FROM
user
WHERE
id = "' .$_SESSION['u_id']. '"';
$result = $this->db->query($sql);
$row = $result->fetch_assoc();
if (session_id() != $row['sess_id']) {
$this->logoutUser();
return false;
} else {
$sql = 'UPDATE
user
SET
last_action = NOW()
WHERE
id = "' .$_SESSION['u_id']. '"';
$result = $this->db->query($sql);
return $result;
}
}
//USER nach einer bestimmten Zeit von Inaktivität ausloggen
private function autoLogout($logout_time)
{
$sql = 'UPDATE
user
SET
sess_id = NULL
WHERE
last_action < DATE_SUB(NOW(), INTERVAL ' .$logout_time. ' MINUTE)
AND
autologin = ""';
$result = $this->db->query($sql);
return $result;
}
}
$db = new mysqli('localhost', 'root', '', 'test');
$user = new user($db, 15, 1);
?>
Hoffe ihr könnt mir helfen.
MfG,
ill-maestro
Kommentar