[PHP] System logowania
Dzisiaj napiszemy sobie skrypt logowania do wcze艣niejszej stworzonego skryptu rejestracji u偶ytkownik贸w. Skrypt b臋dzie sk艂ada艂 si臋 z trzech plik贸w login.php, logged.php oraz logout.php. Rozbudujemy tak偶e wcze艣niej napisan膮 klas臋 User o nowe metody.
Formularz logowania
Standardowo na pocz膮tku tworzymy formularz. Wystarczy tylko skopiowa膰 go z artyku艂u o systemie rejestracji i usun膮膰 pola 'Powt贸rz has艂o' i 'E-mail' .
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css" type="text/css" media="screen" />
<title>Logowanie</title>
</head>
<body>
<div class="container">
<h1>Zaloguj si臋</h1>
<form action="" method="post">
<div class="form-group">
<p><label for="username">Nazwa u偶ytkownika</label><input type="text" name="username" id="username" class="form-control" placeholder="Nazwa u偶ytkownika" required /></p>
</div>
<div class="form-group">
<p><label for="password">Has艂o</label><input type="password" name="password" id="password" class="form-control" placeholder="Has艂o" required /></p>
</div>
<p><input type="submit" class="btn btn-primary" value="Zaloguj" /></p>
</form>
</div>
</body>
</html>
Skrypt logowania
Teraz stworzymy skrypt login.php odpowiadaj膮cy za zalogowanie u偶ytkownika:
<?php
ini_set('display_errors', '1');
error_reporting(E_ALL);
if(!isset($_POST['username'])):
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css" type="text/css" media="screen" />
<title>Logowanie</title>
</head>
<body>
<div class="container">
<h1>Zaloguj si臋</h1>
<form action="" method="post">
<div class="form-group">
<p><label for="username">Nazwa u偶ytkownika</label><input type="text" name="username" id="username" class="form-control" placeholder="Nazwa u偶ytkownika" required /></p>
</div>
<div class="form-group">
<p><label for="password">Has艂o</label><input type="password" name="password" id="password" class="form-control" placeholder="Has艂o" required /></p>
</div>
<p><input type="submit" class="btn btn-primary" value="Zaloguj" /></p>
</form>
</div>
</body>
</html>
<?php else: ?>
<?php
if(!empty($_POST['username']) && !empty($_POST['password'])) {
if(strlen($_POST['username']) >= 3) {
if(strlen($_POST['username']) <= 30) {
if(strlen($_POST['password']) >= 6) {
if(strlen($_POST['password']) <= 16) {
require 'set-db-connection.php';
require 'class.user.php';
$username = preg_replace('/[^\p{L}\p{N}]/iu', '', $_POST['username']);
$user = new User($dbh);
if($user->login($username, $_POST['password'])) {
session_start();
$_SESSION['logged'] = 1;
$_SESSION['username'] = $username;
header('Location: logged.php');
exit;
}
else {
echo '<p>B艂臋dne dane logowania.</p>';
}
}
else {
echo '<p>Has艂o jest zbyt d艂ugie.</p>';
}
}
else {
echo '<p>Has艂o jest zbyt kr贸tkie.</p>';
}
}
else {
echo '<p>Nazwa u偶ytkownika jest zbyt d艂uga.</p>';
}
}
else {
echo '<p>Nazwa u偶ytkownika jest zbyt kr贸tka.</p>';
}
}
else {
echo '<p>Wype艂nij wszystkie pola, aby si臋 zalogowa膰.</p>';
}
?>
<?php endif; ?>
Klasa User
Dodamy teraz do utworzonej w poprzednim artykule klasy User now膮 metod臋 - login.
<?php
class User {
function __construct($dbh) {
$this->dbh = $dbh;
}
public function login($username, $password) {
$sth = $this->dbh->prepare('SELECT password FROM users WHERE username = :username LIMIT 1');
$sth->bindParam(':username', $username, PDO::PARAM_STR);
$sth->execute();
$row = $sth->fetch(PDO::FETCH_ASSOC);
if($row && password_verify($password, $row['password']) === true) {
return true;
}
else return false;
}
public function user_exist($username, $email) {
$sth = $this->dbh->prepare('SELECT id FROM users WHERE username = :username OR email = :email LIMIT 1');
$sth->bindParam(':username', $username, PDO::PARAM_STR);
$sth->bindParam(':email', $email, PDO::PARAM_STR);
$sth->execute();
return $sth->fetch(PDO::FETCH_ASSOC);
}
public function insert_user($username, $email, $password, $ip) {
$sth = $this->dbh->prepare("INSERT INTO users (id, registered_timestamp, username, email, password, ip) VALUES('', CURRENT_TIMESTAMP(), :username, :email, :password, :ip)");
$sth->bindParam(':username', $username, PDO::PARAM_STR);
$sth->bindParam(':email', $email, PDO::PARAM_STR);
$sth->bindParam(':password', $password, PDO::PARAM_STR);
$sth->bindParam(':ip', $ip, PDO::PARAM_STR);
return $sth->execute();
}
}
Plik logged.php
Plik logged.php to strona, na kt贸r膮 u偶ytkownik zostanie przekierowany po poprawnym zalogowaniu. Na stronie tej b臋dzie informacja o zalogowaniu oraz link do strony logout.php
<?php
session_start();
if(!isset($_SESSION['logged'])) {
header('Location: login.php');
exit;
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Zalogowany</title>
</head>
<body>
<div>
<?php
if(isset($_SESSION['logged'])):
?>
<p>Jeste艣 zalogowany jako <strong><?= $_SESSION['username']; ?></strong>.</p>
<p><a href="logout.php">Wyloguj si臋</a></p>
<?php endif; ?>
</div>
</body>
</html>
Plik logout.php
Jeszcze tylko plik wylogowywuj膮cy i to wszystko. W pliku tym usuwamy zmienne sesyjne, kt贸re utworzyli艣my podczas zalogowania oraz niszczymy aktualn膮 sesje funkcj膮 session_destroy.
<?php
session_start();
unset($_SESSION['logged']);
unset($_SESSION['username']);
session_destroy();
header('Location: login.php');
exit;
Aktualna wersja skryptu dost臋pna jest tak偶e na GitHub.
Ca艂o艣膰 OK.
OdpowiedzUsu艅