Gwiazdka nieaktywnaGwiazdka nieaktywnaGwiazdka nieaktywnaGwiazdka nieaktywnaGwiazdka nieaktywna
 

Mechanizm logowania został zaprezentowany w technologii obiektowej języka PHP, korzystano z modułu mysqli – obiektowa obsługa bazy danych MySQL. Przykład korzysta z bazy danych opisanej w artykule „Przykładowa baza danych prostego systemu CMS”. Nie zaprojektowano odnośników na stronie do plików index.php, details.php i logout.php, ale każdy powinien wiedzieć jak rozwiązać ten problem.

Układ plików w projekcie przedstawiono na rysunku 1., można również pobrać plik „klasa-logowania-php.zip” z kodem źródłowym artykułu.

 

Układ plików w artykule

Rys. 1. Układ plików w artykule


Krótki opis plików stworzonych na potrzeby artykułu:

  • class.database.php - klasa odpowiedzialna za połączenie z bazą danych (Listing 1);
  • class.login.php - klasa odpowiedzialna za logowanie do sytemu, wylogowanie. Sprawdza również, czy użytkownik jest zalogowany (Listing 2);
  • logout.php - kod html wyświetlany przy wylogowaniu (Listing 3);
  • index.php - kod html wyświetlany przy logowaniu do systemu (Listing 4);
  • details.php - kod html dla użytkownika zalogowanego (Listing 5).

 

Listing 1. Kod klasy class.database.php

<?php
/**
* Klasa odpowiedzialna za połączenie z bazą danych
*/

class DataBase {

protected $mMysqli; // Uchwyt połączenia z bazą danych

/**
* Konstruktor klasy DataBase
*/

public function __construct() {
// Połączenie z bazą danych
$this->mMysqli = new mysqli("localhost", "login-do-bazy-danych", "hasło-do-bazy-danych", "nazwa-bazy-danych");
// Ustawienie kodowania bazy danych na UTF-8
$this->mMysqli->query('set names utf8');
// Wyświetla komunikat o błędzie, jeśli baza danych nie nawiązała połączenia
if (mysqli_connect_error()) {
printf("Brak połączenia z bazą danych!");
exit;
}
}
} // Koniec klasy DataBase
?>

 

Listing 2. Kod klasy class.login.php

<?php
include 'class.database.php';

/**
* Klasa odpowiedzialna za logowanie do systemu
*/

class Login extends DataBase {

// Przechowuje informację, czy użytkownik jest zalogowany (true), czy nie (false)
protected $logged_in;
// Identyfikator zalogowanego użytkownika
protected $user_id;
// Login użytkownika
protected $login;
// Przechowuje hasło użytkownika
protected $md5_password;


/**
* Przechowuje numer dostępu zalogowanego użytkownika
* (np. 1 - można tylko pisać artykuły;
* 2 - można pisać artykuły i dodawać kategorie, sekcje;
* 3 - można pisać artykuły, dodawać kategorie, sekcje i tworzyć konta;
* 4 - można pisać artykuły, dodawać kategorie, sekcje, tworzyć konta i projektować menu).
*/

protected $access;

/**
* Konstruktor klasy Login
*/

public function __construct() {
parent::__construct();
session_start();

if (!empty($_SESSION['username']) && !empty($_SESSION['password'])) {
$this->login = addslashes($_SESSION['username']);
$this->md5_password = addslashes($_SESSION['password']);
$sql = "SELECT id_uzytkownik, uprawnienie FROM uzytkownicy WHERE login = '$this->login' AND md5_haslo = '$this->md5_password'";
$result = $this->mMysqli->query($sql);

if ($result->num_rows > 0) {
$row = $result->fetch_array(MYSQLI_ASSOC);
$this->user_id = $row["id_uzytkownik"];
$this->logged_in = true;
$this->access = $row["uprawnienie"];
}
}

} // Koniec konstruktora

/**
* Metoda odpowiedzialna za zalogowanie użytkownika do systemu
*/

public function userLogin($str_username, $str_password) {
$this->login = addslashes($str_username);
$this->md5_password = md5($str_password);
$_SESSION['username'] = $str_username;
$_SESSION['password'] = $this->md5_password;

$sql = "SELECT id_uzytkownik, uprawnienie FROM uzytkownicy WHERE login = '$this->login' AND md5_haslo = '$this->md5_password'";
$result = $this->mMysqli->query($sql);

if($result->num_rows > 0) {

$row = $result->fetch_array(MYSQLI_ASSOC);
$this->user_id = $row["id_uzytkownik"];
$this->logged_in = true;
$this->access = $row["uprawnienie"];

return true;
} else {
return false;
}
} // Koniec metody userLogin()

/**
* Metoda odpowiedzialna za wylogowanie użytkownika z systemu
*/

public function logout() {
if ($this->logged_in == true) {
// Przy wylogowaniu należy wyczyścić wszystkie ustawienia użytkownika
$this->logged_in = false;
$this->user_id = 0;
$this->access = 0;

session_destroy();

return true;
} else {
return false;
}
} // Koniec metody logout()

/**
* Metoda sprawdzająca, czy użytkownik jest zalogowany
*/

public function isLoggedIn() {
return $this->logged_in;
} // Koniec metody isLoggedIn()

/**
* Metoda pobiera ID zalogowanego użytkownika
*/

public function getUserId() {
if ($this->logged_in) {
return $this->user_id;
} else {
return false;
}
} // Koniec metody getUserId()

} // Koniec klasy Login

 

Listing 3. Kod strony logout.php

<?php
include 'class.login.php';
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Wylogowanie z systemu</title>
</head>
<body>
<?php

$objLogin = new Login();

if ($objLogin->logout()) {
echo "Wylogowano użytkownika z systemu!";
} else {
echo "Zanim skorzystasz z metody odpowiedzialnej za wylogowanie, powinieneś się zalogować w systemie!";
}

?>
</body>
</html>

 

Listing 4. Kod strony index.php

<?php
include 'class.login.php';
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Logowanie do systemu</title>
</head>
<body>
<?php

$objLogin = new Login();

if ($objLogin->userLogin("login_użytkownika", "hasło_użytkownika") == true) {
echo "Użytkownik został zalogowany do system!";
} else {
echo "Użytkownik nie został zalogowany. Błędne hasło lub login użytkownika!";
}

?>
</body>
</html>

 

Listing 5. Kod strony details.php

<?php
include 'class.login.php';
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Szczegóły zalogowanego użytkownika</title>
</head>
<body>
<?php

$objLogin = new Login();

if ($objLogin->isLoggedIn()) {
echo "Szczegóły zalogowanego użytkownika:\n";
echo "ID zalogowanego użytkownika: {$objLogin->getUserId()}";
// Tu można dodać inne wymagane informacje o użytkowniku.
// W tym miejscu można również wykorzystać atrybut $access klasy Login.

} else {
echo "Brak uprawnień do przeglądania strony!";
}

?>
</body>
</html>

 

Materiały do artykułu można znaleźć w pliku klasa-logowania-php.zip - kodowanie plików tekstowych UTF-8, znaki końca linii (Unix).

 

Dodatkowe zadania:

  1. Zaprojektuj menu do poruszania się pomiędzy plikami index.php, details.php i logout.php.
  2. Zaprojektuj formularz logowania i połącz go z kodem w pliku index.php.
  3. Rozbuduj klasę logowania o dodatkowe pola tabeli uzytkownicy z artykułu „Przykładowa baza danych prostego systemu CMS”.
    1. konto_aktywne - czyli od kiedy użytkownik ma prawo logować się w systemie;
    2. data_zablokowania_konta - do kiedy użytkownik ma prawo logować się w systemie.

Warto przeczytać również:

Polecane książki:

 

Książki Helion