Авторизация по паролю, расположенному в файле, подходит только в одном случае - когда ваш сайт будет использовать только один пользователь.

Конечно, в большинстве случаев это не так - вашим сайтом будет пользоваться большое количество человек.

Поэтому авторизацию пользователей следует реализовывать с помощью базы данных (см. учебник SQL, если вы не умете работать с базами данных).

Как обычно, начнем с самого простого и будем постепенно усложнять.

Несколько пользователей, база данных

Для начала создайте с помощью PhpMyAdmin таблицу users в какой-нибудь тестовой базе данных.

Таблица users должна выглядеть так:

id login (Логин) password (Пароль)
1 user 12345
2 admin 54321

У нас есть два пользователя - user и admin и пароли к ним.

Следующий код реализует простую авторизацию на БД. Что в нем происходит?

Пользователь вводит логин и пароль в поле авторизации, эти данные приходят в скрипт, который делает SQL запрос в базу данных и на основании результата судит о том, авторизовать пользователя или нет:

<!-- Это форма авторизации: -->
	<form action='index.php' method='POST'>
		<input name='login'>
		<input name='password' type='password'>
		<input type='submit' value='Отправить'>
	</form>
<!-- Конец формы авторизации. -->
<?php
	//Если форма авторизации отправлена...
	if ( !empty($_REQUEST['password']) and !empty($_REQUEST['login']) ) {
		//Пишем логин и пароль из формы в переменные (для удобства работы):
		$login = $_REQUEST['login'];
		$password = $_REQUEST['password'];

		/*
			Формируем и отсылаем SQL запрос:
			ВЫБРАТЬ ИЗ таблицы_users ГДЕ поле_логин = $login И поле_пароль = $password.
		*/
		$query = 'SELECT*FROM users WHERE login="'.$login.'" AND password="'.$password.'"';
		$result = mysqli_query($link, $query); //ответ базы запишем в переменную $result
		$user = mysqli_fetch_assoc($result); //преобразуем ответ из БД в нормальный массив PHP

		//Если база данных вернула не пустой ответ - значит пара логин-пароль правильная
		if (!empty($user)) {
			//Пользователь прошел авторизацию, выполним какой-то код.
		} else {
			//Пользователь неверно ввел логин или пароль, выполним какой-то код.
		}
	}
?>

Добавляем сессию

Что должно происходить, если пользователь ввел успешную пару логин-пароль?

Мы должны стартовать сессию и отметить в ней информацию о том, что пользователь авторизовался.

<?php
	/*
		Добавим сессию в код предыдущего примера.

		Если база данных вернула непустой ответ (переменная $result), 
		то пара логин-пароль верна - пользователь успешно авторизовался.
	*/
	if (!empty($user)) {
		/*
			Пользователь прошел авторизацию.
			Стартуем сессию и пишем в переменную auth информацию о том, что мы авторизовались:
		*/
		session_start(); 
		$_SESSION['auth'] = true; 
	} else {
		//Пользователь неверно ввел логин или пароль, выполним какой-то код.
	}
?>

В принципе, можно на этом ограничится и ничего больше не писать в сессию.

Однако, удобно было бы в дальнейшем иметь в сессии информацию об имени пользователя и его id.

В реальных условиях это может быть еще какая-либо информация из базы: email, дата регистрации, количество сообщений и другое. Все зависит от того, какая информация может вам понадобится.

Дополним наш код:

<?php
	/*
		Добавим сессию в код предыдущего примера.

		Если база данных вернула непустой ответ (переменная $result), 
		то пара логин-пароль верна - пользователь успешно авторизовался.
	*/
	if (!empty($user)) {
		/*
			Пользователь прошел авторизацию.
			Стартуем сессию и пишем в переменную auth информацию о том, что мы авторизовались:
		*/
		session_start(); 
		$_SESSION['auth'] = true; 

		/*
			Пишем в сессию логин и id пользователя (их мы берем из переменной $user!):
		*/
		$_SESSION['id'] = $user['id']; 
		$_SESSION['login'] = $user['login']; 
	} else {
		//Пользователь неверно ввел логин или пароль, выполним какой-то код.
	}
?>

Полностью код авторизации примет такой вид:

<!-- Это форма авторизации: -->
	<form action='index.php' method='POST'>
		<input name='login'>
		<input name='password' type='password'>
		<input type='submit' value='Отправить'>
	</form>
<!-- Конец формы авторизации. -->
<?php
	//Если форма авторизации отправлена...
	if ( !empty($_REQUEST['password']) and !empty($_REQUEST['login']) ) {
		//Пишем логин и пароль из формы в переменные (для удобства работы):
		$login = $_REQUEST['login']; 
		$password = $_REQUEST['password']; 

		/*
			Формируем и отсылаем SQL запрос:
			ВЫБРАТЬ ИЗ таблицы_users ГДЕ поле_логин = $login И поле_пароль = $password.
		*/
		$query = 'SELECT*FROM users WHERE login="'.$login.'" AND password="'.$password.'"';
		$result = mysqli_query($link, $query); //ответ базы запишем в переменную $result. 
		$user = mysqli_fetch_assoc($result); //преобразуем ответ из БД в нормальный массив PHP

		//Если база данных вернула не пустой ответ - значит пара логин-пароль правильная
		if (!empty($user)) {

			//Стартуем сессию:
			session_start(); 

			//Пишем в сессию информацию о том, что мы авторизовались:
			$_SESSION['auth'] = true; 

			//Пишем в сессию логин и id пользователя (их мы берем из переменной $user!):
			$_SESSION['id'] = $user['id']; 
			$_SESSION['login'] = $user['login']; 
		} else {
			//Пользователь неверно ввел логин или пароль, выполним какой-то код.
		}
	}
?>

Если мы теперь захотим вывести фразу 'Привет, имя_пользователя', то это будет сделать несложно:

<?php
	echo 'Привет, '.$_SESSION['login'];
?>

Неправильная пара логин-пароль

В том, случае если пользователь ввел неправильно логин или пароль - не следует сообщать ему, что именно он ввел неправильно.

Следует написать такую фразу: 'Неправильный логин или пароль!' - что-то в таком роде.

Зачем это нужно?

Затем, что хакеру сложнее было подобрать пару логин-пароль с помощью перебора.

Если дать ему информацию о том, что логин верен, а пароль - нет, он сможет перебирать только пароли для данного логина, и его задача станет существенно проще.