• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Logowanie na stronę bez użycia bazy danych - sesje oraz wylogowanie

0 głosów
182 wizyt
pytanie zadane 12 stycznia 2021 w PHP przez dequk Użytkownik (810 p.)
edycja 12 stycznia 2021 przez dequk

Witam, tworzę panel i chciałbym do niego dodać logowanie dla administratora. Chciałbym, aby to logowanie działało bez udziału bazy danych, gdyż będzie to tylko jeden użytkownik.

Stworzyłem taki panel logowania:

 


<!DOCTYPE html>
<html>
<head>
	<title>Logowanie do panelu administratora</title>

<!-- Style -->
	<link rel="stylesheet" href="css/bootstrap.min.css">
	<link rel="stylesheet" href="main.css">

</head>
<body>
<div class="container-fluid">
	<div class="row justify-content-center">
		<div class="logowanie col-md-5">
			<div class="card border-dark">
				<div class="card-header">Logowanie</div>
					<form action="login.php" method="POST">
						<div class="form-group m-3">
							<label>Login:</label>
							<input class="w-75" type="text" name="login" placeholder="Podaj login">
						</div>
						<div class="form-group m-3">
							<label>Hasło:</label>
							<input class="w-75" type="password" name="password" placeholder="Podaj hasło">
						</div>
						<div class="form-group m-3">
							<button type="submit" class="btn btn-primary btn-lg">Zaloguj sie!</button>
						</div>
					</form>
			</div>			
		</div>
	</div>
	
</div>


<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous">
</script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous">
</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.min.js" integrity="sha384-w1Q4orYjBQndcko6MimVbzY0tgp4pWB4lZ7lr30WKz0vr/aWKhXdBNmNb5D92v7s" crossorigin="anonymous">
</script>
</body>
</html>

Pastebin panelu: https://pastebin.com/d6uYYZ4a

Wykonałem także taki system logowania złożony na kilka plików takich jak:
- login.php
- haslo.php

Zawartość login oraz haslo:

- login:

<?php

	require_once("dane_logowanie.php");

	session_start();

	if (!empty($_POST['login']) && !empty($_POST['password'])) 
	{
		if ($_POST['login'] == USERNAME)
		{
			if (password_verify($_POST['password'], PASSWORD)) 
			{
				$_SESSION['user'] = htmlspecialchars($_POST['login']);
			}
		}	
	}

header('Location: http://localhost/panel/szybki-dostep.php'); 

- haslo:

<?php
return [
	'login' = 'admin',
	'pass' => '$2y$10$XOKNwXKx61xQBxcrDV5T6elaggk1pMPHKMSXEaDTEcsS.aX1RF.by'
];

Problem na jaki napotkałem to taki iż chciałbym dodać do panelu funkcjonalność sesji, jednak nie wiem jak się za to zabrać.
Czy w taki sposób, aby na każdej stronie przedłużać użytkownikowi tą sesje funkcją session_start() oraz sprawdzać czy jest zalogowany? jeśli nie to zastosowanie funkcji header, aby przekierować go do strony z logowaniem?

Druga sprawa to taka, że zrobiłem panel związany z wylogowaniem, na każdej stronie chcę umieścić przycisk wyloguj, który będzie kierował użytkownika do specjalnej strony w której będzie dopiero potwierdzenie wylogowania. Jednak nie wiem do końca jak mogę oskryptować ten przycisk pod kątem wylogowania.
Przeglądając wiele tutoriali napotkałem się na dość prosty skrypt zakończenia sesji(wylogowania):
 

<?php
session_start();
unset($_SESSION['user']);
session_destroy();
header("Location: http://localhost/panel/index.php");

Przerobiłem go pod swoje potrzeby odnośnie lokalizacji, jednak nie wiem jak mogę go dodać do funkcjonalności.

Panel wylogowania:
 


<!DOCTYPE html>
<html>
<head>
	<title>Wylogowanie się z panelu administratora</title>

<!-- Style -->
	<link rel="stylesheet" href="css/bootstrap.min.css">
	<link rel="stylesheet" href="main.css">

</head>
<body>
<div class="container-fluid">
	<div class="row justify-content-center">
		<div class="wylogowanie">
			<div class="card">
			  <div class="card-header">
			    Panel administratora - wylogowanie
			  </div>
			  <div class="card-body">
			    <h5 class="card-title">Potwierdzenie wylogowania</h5>
			    <p class="card-text">Czy na pewno chcesz wylogować sie z panelu? Jeśli tak wciśnij przycisk wyloguj. Jeśli nie wciśnij przycisk powrót.</p>
			    <a name="buttonWylogujPanel" class="btn btn-success">Wyloguj</a>
			    <a href="szybki-dostep.php" class="btn btn-primary">Wróć do panelu!</a>
			  </div>
			</div>	
		</div>
	</div>	
</div>


<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous">
</script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous">
</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.min.js" integrity="sha384-w1Q4orYjBQndcko6MimVbzY0tgp4pWB4lZ7lr30WKz0vr/aWKhXdBNmNb5D92v7s" crossorigin="anonymous">
</script>
</body>
</html>

Pastebin panelu: 
https://pastebin.com/J033DbmC

Bardzo proszę o pomoc jakbym mógł rozwiązać mój problem.

2 odpowiedzi

+1 głos
odpowiedź 12 stycznia 2021 przez SzkolnyAdmin Maniak (70,780 p.)
wybrane 12 stycznia 2021 przez dequk
 
Najlepsza
Zrób tak, jak ci już napisał asc3rr. Funkcja session_start() dołącza do już istniejącej sesji lub też tworzy nową, gdy sesja nie istnieje. Dobrze byłoby, abyś podał strukturę stron swojej witryny, bo rozumiem, że będzie je można przeglądać także bez logowania. Czy np. tak.

index.php - strona główna z możliwością zalogowania do panelu administracyjnego oraz mapą strony, panelem nawigacyjnym, itp.

panel administracyjny z dostępem tylko dla zalogowanego administratora

strony witryny, które może przeglądać każdy, w tym i administrator

strona logout.php z kodem wylogowania administratora

Jeżeli struktura jest taka, to trzeba pomyśleć o zmiennych sesyjnych, które będą sprawdzane na poszczególnych stronach. Przy okazji - przycisk wylogowania nie ma sensu dla zwykłego, zalogowanego usera, lepiej go utworzyć na stronie tylko wtedy, gdy wchodzi na nią zalogowany admin.
komentarz 12 stycznia 2021 przez dequk Użytkownik (810 p.)
Właśnie co do przycisku to chce zrobić to tak, że jak nie jest się zalogowanym to, aby od razu wyrzucało do logowania, aby nikt niezalogowany w ogóle nie miał dostępu do funkcjonalności.

Czyli, jeśli np ktoś wejdzie na stronę szybki-dostęp.php czy inną to, aby automatycznie wywalało go do logowania.
Zastanawiam się teraz czy nie będzie łatwiej utworzyć jednej tabeli w bazie danych specjalnie na to i z tego korzystać, nie wiem co będzie prostszym rozwiązaniem.
komentarz 12 stycznia 2021 przez SzkolnyAdmin Maniak (70,780 p.)

A ilu chcesz mieć userów? Jak tylko admin, to możesz dane trzymać w pliku (ale baza jest zawsze lepsza).

To z automatycznym przekierowaniem, jest akurat proste do zrobienia przy pomocy zmiennych sesyjnych i funkcji header. Może obejrzyj sobie film MZ: https://miroslawzelent.pl/kurs-php/logowanie-do-strony-sesja-wstrzykiwanie-sql/

komentarz 12 stycznia 2021 przez dequk Użytkownik (810 p.)

Jednego, udało mi się teraz rozważyć sposób z bazą danych, po poprawnym logowaniu przekierowuje mnie do wybranej przez mnie strony, jednak nie wiem jak do końca rozważyć problem związany z brakiem zalogowania, a byciem na stronie.

Mój kod logowania:
 

<?php

	session_start();
		
		if ((!isset($_POST['login'])) || (!isset($_POST['password'])))
			
			{
				header('Location: index.php');
				exit();
			}
			
	if(isset($_POST['buttonLoginPanel']))
	{
		$login=$_POST['login'];
		$password=md5($_POST['password']);
		
		require_once 'db_data.php';
		
		$zapytanie = "SELECT * FROM dane_admin_panel WHERE login = '$login' AND password = '$password'";
		$admin = mysqli_query($connect, $zapytanie) or die("Blad w zapytaniu: $zapytanie");
		
   if (mysqli_num_rows($admin) > 0) 
		{
			while($rekord = mysqli_fetch_assoc($admin)) 
			{

				if (($login == $rekord['login']) && ($password == $rekord['password']))
				{
					$_SESSION['Login'] = $rekord['Login'];
					$_SESSION['zalogowany'] = true;
					$_SESSION['uzytkownik'] = $rekord['login'];
					$_SESSION['varname'] = $login;
					header("Location: ../panel/szybki-dostep.php");
					exit;
				}
			}
        } 
		else 
		{   
					$_SESSION['blad'] = '<span style="color:red">Nieprawidłowy login lub hasło!</span>';
					header('Location: ../szybki-dostep.php');      
        }   

		$connect->close();
	}
?>

 

komentarz 12 stycznia 2021 przez SzkolnyAdmin Maniak (70,780 p.)
W linii 41 obsługujesz przekierowanie na stronę z panelem logowania (index.php ?), a nie do szybkiego dostępu.
komentarz 12 stycznia 2021 przez dequk Użytkownik (810 p.)
Już poprawiłem, powinno być "header('Location: ../panel/szybki-dostep.php'); "?
komentarz 12 stycznia 2021 przez SzkolnyAdmin Maniak (70,780 p.)
W linii 41 obsługujesz przekierowanie przy nieudanym logowaniu. Logicznym byłoby wrócić na stronę, na której się logujesz i wyświetlić komentarz ze zmiennej sesyjnej, którą ustawiłeś.
komentarz 12 stycznia 2021 przez dequk Użytkownik (810 p.)
No tak, dziękuje. Moje niedopatrzenie. Chciałbym jednak jeszcze dopytać do tego panelu wylogowania w jak najprostszy sposób to zadziała?

Sprawdzenie wciśnięcia przycisku?
komentarz 12 stycznia 2021 przez SzkolnyAdmin Maniak (70,780 p.)
Na stronie, z której chcesz się wylogować robisz formularz tylko z przyciskiem. Przyciskowi nadajesz name, np. logout i wysyłasz formularz do strony wylogowania. Na stronie wylogowania sprawdzasz, czy requets poszedł z przycisku. Jeśli tak, to wylogowujesz (niszczysz sesję) i kierujesz się znowu na stronę index. Jeśli nie (przypadkowo wszedłeś na stronę), kierujesz się na stronę, na którą chcesz.
komentarz 12 stycznia 2021 przez dequk Użytkownik (810 p.)
Rozumiem, dziękuje za pomoc.
+1 głos
odpowiedź 12 stycznia 2021 przez asc3rr Nowicjusz (190 p.)

1. We wszystkich header() zmień http://localhost na np.

<?php
session_start();
unset($_SESSION['user']);
session_destroy();
header("Location: ../index.php");

2. Wylogowanie możesz zrobić za pomocą tego kawałka kodu:

<?php
session_start();
session_unset();
header("Location: ../index.php");
?>

3. W pliku `dane-logowania.php` zamiast tego co masz, wpisz to:

<?php
$user=array(
"login"=>"admin",
"password"=>"admin"
);
?>

Ten kod tworzy tablicę asocjacyjną do której możesz się tak odwołać

<?php
include("dane-logowania.php");

$login = $user['login'];
$password = $user['password'];
?>

I póżniej możesz je porównać do danych które otrzymałeś od użytkownika.

Aby sprawdzić czy użytkownik jest zalogowany, w skrypcie logowania utwórz zmienną sesyjną o nazwie np: `isLogged`. Następnie w skrypcie w którym chcesz sprawdzić czy użytkownik jest zalogowany, wpisz:

<?php
session_start();

if(!isset($_SESSION['isLogged'])){
    header("Location: <PANEL_LOGOWANIA>");
}
?>

`session_start()` rozpoczyna sesję w danym skrypcie, a w linii z if'em sprawdzamy czy zmienna sesyjna `isLogged` jest ustawiona. Jeżeli nie jest zalogowany, odsyłamy go do panelu logowania.

 

Z tego co wiem, użytkownik nie może w prosty sposób manipulować ciastkiem z ID sesji oraz danymi sesji.

komentarz 12 stycznia 2021 przez dequk Użytkownik (810 p.)
1. W jaki sposób bedę w takim razie trzymać dane do logowania oraz hash hasła?
2. Czyli utworzyć taką zmienną i dać w każdej stronie nad DOCTYPE'm?
komentarz 12 stycznia 2021 przez asc3rr Nowicjusz (190 p.)
1. W pliku `dane-logowania.php`, tak jak wcześniej

2. Tak, ale zmienną tworzysz raz.
komentarz 12 stycznia 2021 przez dequk Użytkownik (810 p.)
Myślałem, że session_start() służy także do przedłużania sesji, jeśli istnieje. W taki sposób jak mogę ją przedłużyć?
komentarz 12 stycznia 2021 przez asc3rr Nowicjusz (190 p.)
Tak
komentarz 12 stycznia 2021 przez dequk Użytkownik (810 p.)
Niestety nie rozumiem odpowiedzi.

Podobne pytania

+1 głos
1 odpowiedź 123 wizyt
pytanie zadane 6 marca 2021 w PHP przez Mateusz Wydra Początkujący (250 p.)
+1 głos
3 odpowiedzi 595 wizyt
pytanie zadane 27 czerwca 2015 w PHP przez kamil_1996 Nowicjusz (130 p.)
0 głosów
2 odpowiedzi 164 wizyt
pytanie zadane 6 lipca 2019 w PHP przez borygooo Początkujący (320 p.)

88,699 zapytań

137,306 odpowiedzi

306,723 komentarzy

58,890 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...