Felhasználói eszközök

Eszközök a webhelyen


oktatas:programozas:php:php_azonositas:komplex

< PHP azonosítás

PHP alapú azonosítás MySQL adatbázisból

  • Szerző: Sallai András
  • Copyright © Sallai András, 2014, 2019
  • Licenc: GNU Free Documentation License 1.3

Bevezetés

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.

Mire van szükségünk

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.

Szervezés

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

Konfigurációs fájl létrehozása

Készítünk egy konfigurációs állományt, hogy a weboldalunk beállításait csak egy helyen kelljen megadni.

config.php
<?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.

Segédfüggvények létrehozása

Az fg.php fájlban újrahasznosítható függvénygyűjteményeinket helyeztük el.

fg.php
<?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");
}

Kezdőoldal létrehozása

index.php
<?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();

Adatbázis létrehozása

A zoldzrt.sql állomány csak egy mentés az adatbázisról.

zoldzrt.sql
-- 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 */;

Adatbázis-kezelő függvények

db.php
<?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);
}

Regisztrációs felület létrehozása

admin.php
<?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();
add.php
<?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();

Beléptető felület létrehozása

login.php
<?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();
auth.php
<?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();

Védett felület létrehozása

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ő.

vedett.php
<?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();

Kiléptetés

logout.php
<?php
 
session_start();
session_destroy();
header("location: login.php"); 

Nézetek

templates/admin.tpl
<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>
templates/foot.tpl
</div>
</body>
</html>
templates/head.tpl
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>$title</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div id="content">
templates/index.tpl
<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>
templates/login.tpl
<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>
templates/vedett.tpl
<h1>Védett oldal</h1>
<div id="menu">
	<ul>
		<li><a href="admin.php">Adminisztráció</a></li>
		<li><a href="logout.php">Kijelentkezés</a></li>
	</ul>
</div>

Stílus

Egyszerű menü.

css/style.css
#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;
}

Letöltés

Figyelem! Ez a link elavult!

oktatas/programozas/php/php_azonositas/komplex.txt · Utolsó módosítás: 2021/01/04 18:11 szerkesztette: admin