Azonosítást többféle képen megvalósíthatunk. Csak PHP alapokon. PHP és Ajax-al keverve. Mi most szimplán PHP alapon fogjuk megvalósítani.
Az azonosításhoz szükségünk van egy adatbázisra, ahol a jelszavakat tároljuk. Lehetne ez éppen egy szimpla állomány is, de az a korrekt, ha adatbázis-kezelőn keresztül érjük el. Az adatbázisnak a MySQL adatbázis-kezelőt fogjuk használni, mivel ez a legelterjedtebb. Bár ha valaki az újabb népszerű MariaDB adatbázis-kezelőt használja abban is megvalósítható ugyanígy.
Szükségünk lesz egy olyan felületre ahol felvesszük a felhasználókat és egy olyanra, ahol maga a bejelentkezés történik.
A fentiek mellé készíthetünk egy főoldalt, amely megjelenik a belépés előtt, és egy védett oldalt, amely a belépés után jelenik csak meg.
Szükséges lenne a védett oldal védelmére is, ezt session kezeléssel oldjuk meg.
A következő állományokkal fogunk dolgozni
projekt01 |--css/ | `--style.css |--templates/ | |--admin.tpl | |--foot.tpl | |--head.tpl | |--index.tpl | |--login.tpl | `--vedett.tpl |--add.php |--admin.php |--auth.php |--config.php |--db.php |--fg.php |--index.php |--login.php |--logout.php `--vedett.php
Készítünk egy konfigurációs állományt, hogy a weboldalunk beállításait csak egy helyen kelljen megadni.
<?php $db["host"] = "localhost"; $db["name"] = "pok"; $db["user"] = "pok"; $db["pass"] = "titok"; $db["charset"] = "utf8"; $website["title"] = "Pók Zrt"; $website["logpath"] = "log.txt"; $website["templatesPath"] = "templates";
A konfigurációs állományban asszociatív tömböket használunk, ami persze nem kötelező, de átláthatóbbá teszi azt. A példánkban látjuk mely beállítások tartoznak az adatbázishoz, melyek a webhely beállításai.
Az fg.php fájlban újrahasznosítható függvénygyűjteményeinket helyeztük el.
<?php require_once("config.php"); function scrypt($string){ $salt1 = "dkflasd384393jkfd89829343h4ad"; $salt2 = "kdjfoei93829flwsjfo834294392h"; $saltedStr = $salt1 . $string . $salt2; $cryptedStr = hash("sha512", $saltedStr); return $cryptedStr; } function slog($msg){ $now = date("Y-m-d h:i:s "); $row = $now . $msg . "\n"; global $website; $logfile = fopen($website["logpath"], "a"); fputs($logfile, $row); fclose($logfile); } function htmlHead($title){ global $website; echo file_get_contents("{$website["templatesPath"]}/head.tpl"); } function htmlFoot(){ global $website; echo file_get_contents("{$website["templatesPath"]}/foot.tpl"); }
<?php require_once "fg.php"; require_once "config.php"; htmlHead($website["title"]); echo "<h1>{$website["title"]}</h1>"; echo file_get_contents("{$website["templatesPath"]}/index.tpl"); htmlFoot();
A zoldzrt.sql állomány csak egy mentés az adatbázisról.
-- phpMyAdmin SQL Dump -- version 3.5.8.1deb1 -- http://www.phpmyadmin.net -- -- Hoszt: localhost -- Létrehozás ideje: 2014. Feb 11. 23:48 -- Szerver verzió: 5.5.34-0ubuntu0.13.04.1 -- PHP verzió: 5.4.9-4ubuntu2.4 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; -- -- Adatbázis: `zoldzrt` -- -- -------------------------------------------------------- -- -- Tábla szerkezet ehhez a táblához `users` -- CREATE TABLE IF NOT EXISTS `users` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `fullname` VARCHAR(100) COLLATE utf8_hungarian_ci NOT NULL, `user` VARCHAR(50) COLLATE utf8_hungarian_ci NOT NULL, `pass` VARCHAR(512) COLLATE utf8_hungarian_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_hungarian_ci AUTO_INCREMENT=15 ; -- -- A tábla adatainak kiíratása `users` -- INSERT INTO `users` (`id`, `fullname`, `user`, `pass`) VALUES (12, 'Teszt József', 'joska', '99aed78d829f9cdb92965b9376be888c2ebde71d3fecb07ca828ce1c61b28582a95822dd5e398c8b16a3301021798fdaa7c48de4e996cbdd1365d4f64d6b3f41'), (14, 'Teszt Mária', 'mari', '99aed78d829f9cdb92965b9376be888c2ebde71d3fecb07ca828ce1c61b28582a95822dd5e398c8b16a3301021798fdaa7c48de4e996cbdd1365d4f64d6b3f41'); /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
<?php require_once("config.php"); require_once("fg.php"); function existUser($conn, $user){ $sql = "select user from users where user=\"$user\""; $res = mysqli_query($conn, $sql); $row = mysqli_fetch_assoc($res); if($row['user'] == $user){ return true; } else { return false; } } function authUser($conn, $data){ $cryptedPass = scrypt($data['pass']); $sql = "select user from users where pass=\"$cryptedPass\""; $res = mysqli_query($conn, $sql); if(mysqli_num_rows($res) > 0){ return true; } else { return false; } } function connect(){ global $db; $conn = mysqli_connect($db["host"], $db["user"], $db["pass"], $db["name"]); mysqli_set_charset($conn, $db["charset"]); if(mysqli_connect_errno()){ slog("Nem tudok kapcsolódni az adatbázishoz!"); die("Nem tudok kapcsolódni az adatbázishoz!" . mysql_error()); } return $conn; } function addUser($conn, $data){ $cryptedPass = scrypt($data['pass']); $sql = "insert into users (fullname, user, pass) values (\"{$data['fullname']}\", \"{$data['user']}\", \"$cryptedPass\")"; $res = mysqli_query($conn, $sql); //slog($res); if($res == "1"){ return true; } else { return false; } } function close($conn){ mysqli_close($conn); }
<?php require_once("fg.php"); require_once("config.php"); htmlHead($website["title"]); echo "<h1>{$website["title"]}</h1>"; echo file_get_contents("{$website["templatesPath"]}/admin.tpl"); htmlFoot();
<?php require_once("config.php"); require_once("db.php"); require_once("fg.php"); htmlHead($website["title"]); if(empty($_POST['user']) || empty($_POST['pass'])){ echo "A felhasználónév és jelszó kötelező!<br>"; echo "<a href=\"admin.php\">Vissza</a>"; } else { $data['fullname'] = $_POST['fullname']; $data['user'] = $_POST['user']; $data['pass'] = $_POST['pass']; $data['passagain'] = $_POST['passagain']; if($data['pass'] == $data['passagain']){ $con = connect(); if(!existUser($con, $data['user'])){ if(addUser($con, $data)){ echo "A felhasználót sikeresen felvettük."; echo "<a href=\"admin.php\">Adminoldal</a>"; } else { echo "Hiba! A felhasználó felvétele sikertelen!"; } } else { echo "Már van ilyen felhasználó!<br>"; echo "<a href=\"admin.php\">Vissza</a>"; } close($con); } else { echo "A jelszó nem egyezik!<br>"; echo "<a href=\"admin.php\">Vissza a regisztrációhoz</a>"; } } htmlFoot();
<?php require_once("fg.php"); require_once("config.php"); htmlHead($website["title"]); echo "<h1>{$website['title']}</h1>"; echo file_get_contents("{$website["templatesPath"]}/login.tpl"); htmlFoot();
<?php session_start(); require_once("config.php"); require_once("db.php"); require_once("fg.php"); htmlHead($website["title"]); if(!empty($_POST['user']) && !empty($_POST['pass'])) { $data['user'] = addslashes($_POST['user']); $data['pass'] = addslashes($_POST['pass']); $con = connect(); $authOk = false; if(authuser($con, $data)){ $authOk = true; } if($authOk){ $_SESSION['authOk']=1; header('Location: vedett.php'); } else { echo "<h3>Hiba! Sikertelen azonosítás!</h3>"; echo "<a href=\"login.php\">Vissza</a>"; } close($con); } else { echo "Hiányzó adat"; } htmlFoot();
Vegyük észre a védett oldalon a session kezelést. Megnézzük, hogy be van-e állítva egy sesssion. Ha igen, akkor az oldal megnézhető.
<?php session_start(); require_once "fg.php"; require_once "config.php"; htmlHead($website["title"]); if(isset($_SESSION['authOk'])){ echo file_get_contents("{$website["templatesPath"]}/vedett.tpl"); } else { echo "Nem vagy bejelentkezve!"; } htmlFoot();
<?php session_start(); session_destroy(); header("location: login.php");
<div id="menu"> <ul> <li><a href="index.php">Főoldal</a></li> <li><a href="login.php">Bejelentkezés</a></li> <li><a href="admin.php">Adminisztráció</a></li> </ul> </div> <div id="adminbox"> <form action="add.php" method="post"> <fieldset> <legend>Felhasználó felvétele</legend> <label for="fullname">Teljesnév: </label> <input type="text" name="fullname" id="fullname"><br> <label for="user">Felhasználónév: </label> <input type="text" name="user" id="user"><br> <label for="pass">Jelszó: </label> <input type="password" name="pass" id="pass"><br> <label for="passagain">Jelszó újra: </label> <input type="password" name="passagain" id="passagain"><br> <input type="submit" value="Hozzáad"> </fieldset> </form> </div>
</div> </body> </html>
<!doctype html> <html> <head> <meta charset="utf-8"> <title>$title</title> <link rel="stylesheet" href="css/style.css"> </head> <body> <div id="content">
<div id="menu"> <ul> <li><a href="#">Főoldal</a></li> <li><a href="login.php">Bejelentkezés</a></li> <li><a href="admin.php">Adminisztráció</a></li> </ul> </div>
<div id="menu"> <ul> <li><a href="index.php">Főoldal</a></li> <li><a href="login.php">Bejelentkezés</a></li> <li><a href="admin.php">Adminisztráció</a></li> </ul> </div> <div id="loginbox"> <form action="auth.php" method="post"> <fieldset> <legend>Bejelentkezés</legend> <label for="user">Felhasználónév:</label> <input type="text" name="user" id="user"><br> <label for="pass">Jelszó:</label> <input type="password" name="pass" id="pass"><br> <input type="submit" value="Bejelentkezés"> </fieldset> </form> </div>
Egyszerű menü.
#content { margin: 2% 10%; background-color: orange; padding: 15px; border-radius: 15px; box-shadow: 15px 15px 15px red; } #adminbox form fieldset label, #loginbox form fieldset label { display: inline-block; width: 110px; } #menu ul { list-style-type: none; } #menu ul li { display: inline-block; background-color: #F8CD1D; padding: 3px; } #menu ul li:hover { display: inline-block; background-color: #55E41B; padding: 3px; } #menu ul li a { text-decoration: none; }
Figyelem! Ez a link elavult!