Panel Administratora - dostęp

0

Witam,

chciałem zrobić do stronki panel administratora. Utworzyłem w bazie danych kolumne user_rang, 0 - zwykły użytkownik, 1 - admin. Chciałbym, żeby przy logowaniu sprawdzało kto się loguje, jeśli loguje się admin, to żeby od razu go przerzucało do adminpanel.php, a jak zwykły użytkownik to index.php. Napisałem już coś, ale nie wiem gdzie leży błąd, nie działa.

plik login.php


```<?php
session_start(); 

include('config.php');


if(isset($_SESSION['login_id'])){
  if (isset($_SESSION['pageStore'])) {
      $pageStore = $_SESSION['pageStore'];
header("location: $pageStore"); 
}


if (isset($_POST['signIn'])) {
if (empty($_POST['email']) || empty($_POST['password'])) {
echo "Wypełnij pola";
}
else
{

$email = $_POST['email'];
$password = $_POST['password'];
$ranga = $_POST['user_rang'];





include('config.php');




$sQuery = "SELECT id, password from account where email=? LIMIT 1"; 
$rQuery = "SELECT user_rang from account where user_rang=";


$stmt = $conn->prepare($sQuery);
$stmt->bind_param("s", $email);
$stmt->execute(); //wykonanie
$stmt->bind_result($id, $hash); 
$stmt->store_result(); // zapisz wynik



$stmt = $conn->prepare($rQuery); 

if ($ranga == "1") { 
header("location: adminpanel.php");
 
}
 
else {
 
echo('Brak uprawnień');
 
}


if($stmt->fetch()) { 
  if (password_verify($password, $hash)) {
          $_SESSION['login_id'] = $id;

          if (isset($_SESSION['pageStore'])) {
            $pageStore = $_SESSION['pageStore'];
          }
          else {
            $pageStore = "index.php";
          }
          header("location: $pageStore"); 
          $stmt->close();
          $conn->close();

        }
else {
       echo 'Niepoprawny login lub hasło!';
     }
      } else {
       echo 'Niepoprawny login lub hasło!';
     }
$stmt->close();
$conn->close(); 
}
}
?>
0

A dlaczego range przchowujesz w zmiennje $_POST

$ranga = $_POST['user_rang'];

Nie lepiej w bazie jako odpowioednie pole i wtedy jak się loguje dany użytkownik to sprawdza czy dane pole nie jest 1 albo 0.

0

W bazie jest ta kolumna user_rang, ale nie wiem jak to zapisać, żeby działało?
Coś takiego mam:


```if ($ranga == "1") { 
header("location: adminpanel.php");

}

else {

echo('Brak uprawnień');

}
0
<?php
session_start(); 

include('config.php');

if(isset($_SESSION['login_id'])){
  if (isset($_SESSION['pageStore'])) {
      $pageStore = $_SESSION['pageStore'];
header("location: $pageStore"); 
}

if (isset($_POST['signIn'])) {
if (empty($_POST['email']) || empty($_POST['password'])) {
echo "Wypełnij pola";
}
else
{

$email = $_POST['email'];
$password = $_POST['password'];
$ranga = $_POST['user_rang'];

include('config.php');

$sQuery = "SELECT id, password,user_rang from account where email= '$email' and ranga = '$ranga'"; 
$rQuery = "SELECT user_rang from account where user_rang=";

$stmt = $conn->prepare($sQuery);
$stmt->bind_param("s", $email);
$stmt->execute(); //wykonanie
//$stmt->bind_result($id, $hash); 
//$stmt->store_result(); // zapisz wynik

//$stmt = $conn->prepare($rQuery); 
//tutaj musisz sam pokonbinowac jak to będzie wyglądało czy to jest poprawny zapis bo nigdy nie używałem tej biblioteki
if ($stmt->user_rang == "1") { 
header("location: adminpanel.php");

}

else {

echo('Brak uprawnień');

}

if($stmt->fetch()) { 
  if (password_verify($password, $hash)) {
          $_SESSION['login_id'] = $id;

          if (isset($_SESSION['pageStore'])) {
            $pageStore = $_SESSION['pageStore'];
          }
          else {
            $pageStore = "index.php";
          }
          header("location: $pageStore"); 
          $stmt->close();
          $conn->close();

        }
else {
       echo 'Niepoprawny login lub hasło!';
     }
      } else {
       echo 'Niepoprawny login lub hasło!';
     }
$stmt->close();
$conn->close(); 
}
}
?>
0

Ogólnie jak zmieniłem na twoje to nie działa teraz w ogóle logowanie, bo wywala błąd tu:

  • $ranga = $_SESSION['user_rang'];
  • $stmt->bind_param("s", $email);
0

No to weź odhaszuj te linijki mussiz sam pokombinowac bo ja z w tej bibliotece PDO nigdy nie robiłem.

//$stmt->bind_result($id, $hash); 
//$stmt->store_result(); // zapisz wynik

//$stmt = $conn->prepare($rQuery); 
0

Próbowałem z odhszowanymi i też to samo, ale dzięki za pomoc. Może ktoś jeszcze się wypowie?

0

Jakby coś to tutaj masz sprawdzone rozwiązanie: https://github.com/delight-im/PHP-Auth

0

Dzięki, ale wolałbym zostać przy swoim, bo bym musiał cały kod przerabiać.

0

Troche masz tam haos.

Struktura tabeli: ID, password, user_rang, email


<?php

session_start();


											function ReturnRow($ServerName, $UserName, $UserPassword, $DbName, $TableContent)
											{
												
												$Connection = mysqli_connect($ServerName, $UserName, $UserPassword);
						
												if(!$Connection)
												{
									
												die ('Nie można się polączyć z MySQL : ' . mysqli_connect_error());
														
												}
								
												$SelectDB = mysqli_select_db($Connection, $DbName);
						
												if(!$SelectDB)
									
												{
									
												print 'Nie mozna polaczyc sie z baza danych ' . mysqli_connect_error();
							
												}
												
													$HasloZFormularza = "haslo";
													$LoginZFormularza = "[email protected]";
													
										
													$sql = "SELECT id, password, user_rang, email FROM $TableContent WHERE password='$HasloZFormularza' AND email='$LoginZFormularza'";
													$result = mysqli_query($Connection,$sql);
													
													if (mysqli_num_rows($result) > 0) 
														{
															
															while($row = mysqli_fetch_assoc($result))
																{
																	
																	
																	if($row['user_rang'] == 1)
																	{
																		
																		$_SESSION['usr'] = '1';
																		header('location: adminpanel.php');
																		exit;
																		
																	} else {
																		
																		$_SESSION['usr'] = '0';
																		header('location: index.php');
																		exit;
																		
																	}
																	
																	
																}
																
																
													
														} else {
														
															print 'Brak danych spełniajacyc hte kryteria';
														
														}
												
												mysqli_close($Connection);
											}
											
										ReturnRow('localhost', 'root', 'pass', 'rangi', 'account');
// server, user, haslo, nazwa bazy, nazwa tabeli



?>

Teraz tylko sprawdzasz sesje na kazdej z tych stron

0

Tak wygląda tabela:
title

Tak wygląda register.php:


```<?php
session_start();


if(isset($_SESSION['login_id'])){
  if (isset($_SESSION['pageStore'])) {
      $pageStore = $_SESSION['pageStore'];
header("location: $pageStore");
    }
}
 if (isset($_POST['signUp'])) {
if(!empty($_POST['fullName']) && !empty($_POST['email']) && !empty($_POST['newPassword']) && !empty($_POST['g-recaptcha-response'])){
$captcha = $_POST['g-recaptcha-response'];
$secretKey = "6LeVDJ4UAAAAAK1bx9E5VKOxNOnulyemW8l4Kfpi"; 
$ip = $_SERVER['REMOTE_ADDR']; //ip jest również wysyłane przez google
$response=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$secretKey."&response=".$captcha."&remoteip=".$ip); google'a
        $responseKeys = json_decode($response,true);	 
        if(intval($responseKeys["success"]) !== 1) { 
         
        } else {
      echo "Rejestracja zakończona sukcesem!";
        }
}
		
if (empty($_POST['fullName']) || empty($_POST['email']) || empty($_POST['newPassword']) || empty($_POST['g-recaptcha-response'] )) {
	$captcha = $_POST['g-recaptcha-response'];
echo "Proszę wypełnić wszystkie wymagane pola.";
}
else
{


        
		

		
		
		//if (empty($_POST['fullName']) || empty($_POST['email']) || empty($_POST['newPassword'] || empty($_POST['g-recaptcha-response']) )) {
$fullName = $_POST['fullName'];
$email = $_POST['email'];
$password = $_POST['newPassword'];
$hash = password_hash($password, PASSWORD_DEFAULT);


include('config.php');

$sQuery = "SELECT id from account where email=? LIMIT 1";
$iQuery = "INSERT Into account (fullName, email, password) values(?, ?, ?)"; 



if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$stmt = $conn->prepare($sQuery);
$stmt->bind_param("s", $email);
$stmt->execute();
$stmt->bind_result($id);
$stmt->store_result();
$rnum = $stmt->num_rows;

if($rnum==0) { 
          $stmt->close();
          
          $stmt = $conn->prepare($iQuery);
    	  $stmt->bind_param("sss", $fullName, $email, $hash);
          if($stmt->execute()) {
			 
        //echo 'Rejestracja zakończona sukcesem!';
		}
        } else { 
       echo 'Ktoś już zarejestrował się na ten adres email.';
     }
$stmt->close();
$conn->close(); 
}
}
0

Dodaj to tzn dodaj tylko te druga linijke

$HasloZFormularza = "haslo"; // twoje haslo
$HasloZFormularza1 = password_hash($HasloZFormularza, PASSWORD_DEFAULT);
$EmailZFormularza = "[email protected]"; // twoj email

i w zapytaniu zmien z $HasloZFormularza na $HasloZFormularza1

0

Troche trzeba zmienic bo to haszowanie bedziesz musial sprawdzac potem po zapytaniu. Sprawdz najpierw sam email:


<?php


session_start();


											function ReturnRow($ServerName, $UserName, $UserPassword, $DbName, $TableContent)
											{
												
												$Connection = mysqli_connect($ServerName, $UserName, $UserPassword);
						
												if(!$Connection)
												{
									
												die ('Nie można się polączyć z MySQL : ' . mysqli_connect_error());
														
												}
								
												$SelectDB = mysqli_select_db($Connection, $DbName);
						
												if(!$SelectDB)
									
												{
									
												print 'Nie mozna polaczyc sie z baza danych ' . mysqli_connect_error();
							
												}
												
													$HasloZFormularza = "hasloadmin";
													
													$EmailZFormularza = "[email protected]";
													
													
													$sql = "SELECT id, password, user_rang, email FROM $TableContent WHERE email='$EmailZFormularza'";
													$result = mysqli_query($Connection,$sql);
													
													if (mysqli_num_rows($result) > 0) 
														{
															
															while($row = mysqli_fetch_assoc($result))
																{
																	
															
																	if (password_verify($HasloZFormularza, $row['password'])) {
																		
																		if($row['user_rang'] == 1)
																	{
																		
																		$_SESSION['usr'] = '1';
																		header('location: adminpanel.php');
																		exit;
																		
																	} else {
																		
																		$_SESSION['usr'] = '0';
																		header('location: index.php');
																		exit;
																		
																	}
																		
																	} else {
																		
																		exit('bledne dane');
																		
																	}
																		
																		
																		
																	
																	
																	
																	
																	
																}
																
																
													
														} else {
														
															print 'Brak danych spełniajacyc hte kryteria';
														
														}
												
												mysqli_close($Connection);
											}
											
										ReturnRow('localhost', 'root', 'pwd', 'rangi', 'account');
										
										
										

?>
1
$pass = password_hash('haslo', PASSWORD_DEFAULT);
$sql1 = "INSERT INTO account" . " (fullName, email, password, user_rang) VALUES ('User', '[email protected]', '$pass', '0');

W tym momencie zmienna $pass zawiera string 'haslo' ktpore jest haszowane i zapisane do bazy i takie tez podajesz w zmiennej $EmailZFormularza (bez haszowania). Natomiast email: [email protected] podajesz w zmiennej $EmailZFormularza.

1 użytkowników online, w tym zalogowanych: 0, gości: 1