Описание создания алгоритма регистрации и авторизации пользователей на вашем сайте

Сложно определить текст запроса, популярнее регистрации и авторизации пользователей для сайта. Пример простого сценария для ограничения доступа посетителей к узлам сайта

Дата публикации: 01.08.2013
Вероятнее всего, актуальность кода, приведенного в этой статье, на момент его прочтения читателем близка к нулю. Читатель, конечно же, скорее всего, желает изучить пример реализации регистрации и авторизации пользователей на PHP, JavaScript и MySQL, соответствующий сегодняшним техническим требованиям и требованиям безопасности. Поэтому, если читателю интересно, в целях ознакомления он может и данный материал изучить, но, скорее всего, гораздо полезнее для него будет статья, размещенная уже на сайте моего предприятия, и на этом же сайте, но в другой статье.

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

Вероятно, вы хотели бы увидеть более современный способ создания такой формы. Полное его современное и актуальное представление у меня пока что еще в планах, но зато вы можете увидеть, что форму обратной связи можно построить с помощью объектно-ориентированных приемов в PHP.

Для начала давайте оговорим все шаги, которые сделаем далее. Что нам вообще нужно? Нам нужен сценарий, который будет регистрировать пользователя, авторизовать пользователя, переадресовывать пользователя куда-либо после авторизации. Также нам нужно будет создать страницу, которая будет защищена от доступа неавторизованных пользователей. Для регистрации и авторизации нам необходимо будет создать HTML-формы. Информацию о зарегистрированных пользователях мы будем хранить в базе данных. Это значит, что нам еще нужен скрипт подключения к СУБД. Всю работу у нас будут выполнять функции, которые мы сами напишем. Эти функции мы сохраним в отдельный файл.

Итак, нам нужны следующие файлы:

  • соединение с СУБД;
  • пользовательские функции;
  • авторизация;
  • регистрация;
  • защищенная страница;
  • сценарий завершения работы пользователя;
  • сценарий, проверяющий статус авторизации пользователя;
  • таблица стилей для простейшего оформления наших страниц.

Всё это будет бессмысленно, если у вас нет соответствующей таблицы в базе данных. Запустите инструмент управления своим СУБД (PhpMyAdmin или командную строку, как удобнее) и выполните в нем следующий запрос:


CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `login` char(16) NOT NULL,
  `password` char(40) NOT NULL,
  `reg_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Наши файлы со сценариями я назову так (все они будут лежать в одном каталоге):

  • database.php;
  • functions.php;
  • login.php;
  • registration.php;
  • index.php;
  • logout.php;
  • checkAuth.php;
  • style.css.

Назначение каждого из них, я уверен, вам понятно. Начнем со скрипта соединения с СУБД. Вы его уже видели. Просто сохраните код этого скрипта в файле с именемdatabase.php. Пользовательские функции мы будем объявлять в файлеfunctions.php. Как это всё будет работать? Неавторизованный пользователь пытается получить доступ к защищенному документуindex.php, система проверяет авторизован ли пользователь, если пользователь не авторизован, он переадресовывается на страницу авторизации. На странице авторизации пользователь должен видеть форму авторизации. Давайте сделаем её.


<html>
<head>
	<title>Авторизация пользователей</title>
	<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
	<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form action="" method="post">
	<div class="row">
		<label for="login">Ваш логин:</label>
		<input type="text" class="text" name="login" id="login" />
	</div>
	<div class="row">
		<label for="password">Ваш пароль:</label>
		<input type="password" class="text" name="password" id="password" />
	</div>
	<div class="row">
		<input type="submit" name="submit" id="btn-submit" value="Авторизоваться" />
	</div>
</form>
<p class="to_reg">Если вы не зарегистрированы в системе, <a href="registration.php">зарегистрируйтесь</a>.</p>
</body>
</html>

Теперь нашей форме нужно придать некий вид. Заодно определим правила для других элементов. Я, забегая вперед, приведу содержимое таблицы стилей полностью.


/* файл style.css */
.row {
	margin-bottom:10px;
	width:220px;
}
	.row label {
		display:block;
		font-weight:bold;
	}
	.row input.text {
		font-size:1.2em;
		padding:2px 5px;
	}
.to_reg {
	font-size:0.9em;
}
.instruction {
	font-size:0.8em;
	color:#aaaaaa;
	margin-left:2px;
	cursor:default;
}
.error {
	color:red;
	margin-left:3px;
}

Если всё сделано верно, у вас в броузере должно быть следующее:

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


<html>
<head>
	<title>Регистрация пользователей</title>
	<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
	<form action="" method="post">
		<div class="row">
			<label for="login">Укажите ваш логин:</label>
			<input type="text" class="text" name="login" id="login" value="<?=$fields['login'];?>" />
			<div class="error" id="login-error"><?=$errors['login'];?></div>
			<div class="instruction" id="login-instruction">В имени пользователя могут быть только символы латинского алфавита, цифры, символы '_', '-', '.'. Длина имени пользователя должна быть не короче 4 символов и не длиннее 16 символов</div>
		</div>
		<div class="row">
			<label for="password">Напишите ваш пароль:</label>
			<input type="password" class="text" name="password" id="password" value="" />
			<div class="error" id="password-error"><?=$errors['password'];?></div>
			<div class="instruction" id="password-instruction">В пароле вы можете использовать только символы латинского алфавита, цифры, символы '_', '!', '(', ')'. Пароль должен быть не короче 6 символов и не длиннее 16 символов</div>
		</div>
		<div class="row">
			<label for="password_again">Повторите введенный пароль:</label>
			<input type="password" class="text" name="password_again" id="password_again" value="" />
			<div class="error" id="password_again-error"><?=$errors['password_again'];?></div>
			<div class="instruction" id="password_again-instruction">Повторите введенный ранее пароль</div>
		</div>
		<div class="row">
			<!-- Кнопка отправки данных формы -->
			<input type="submit" name="submit" id="btn-submit" value="Зарегистрироваться" />
			
			<!-- Кнопка сброса полей формы к исходному состоянию -->
			<input type="reset" name="reset" id="btn-reset" value="Очистить" />
		</div>
	</form>
</body>
</html>

Вы, наверное, обратили внимание на то, что в HTML-коде присутствуют переменные PHP. Они являются содержимым атрибутов текстовых полей форм, содержимом контейнеров, предназначенных для вывода ошибок. Но мы не инициализировали эти переменные. Давайте сделаем это.


<?
// Инициализируем переменные для введенных значений и возможных ошибок
$errors = array();
$fields = array();
?>
<html>
<head>
	<title>Регистрация пользователей</title>
	<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
	<form action="" method="post">
		<div class="row">
			<label for="login">Укажите ваш логин:</label>
			<input type="text" class="text" name="login" id="login" value="<?=$fields['login'];?>" />
			<div class="error" id="login-error"><?=$errors['login'];?></div>
			<div class="instruction" id="login-instruction">В имени пользователя могут быть только символы латинского алфавита, цифры, символы '_', '-', '.'. Длина имени пользователя должна быть не короче 4 символов и не длиннее 16 символов</div>
		</div>
		<div class="row">
			<label for="password">Напишите ваш пароль:</label>
			<input type="password" class="text" name="password" id="password" value="" />
			<div class="error" id="password-error"><?=$errors['password'];?></div>
			<div class="instruction" id="password-instruction">В пароле вы можете использовать только символы латинского алфавита, цифры, символы '_', '!', '(', ')'. Пароль должен быть не короче 6 символов и не длиннее 16 символов</div>
		</div>
		<div class="row">
			<label for="password_again">Повторите введенный пароль:</label>
			<input type="password" class="text" name="password_again" id="password_again" value="" />
			<div class="error" id="password_again-error"><?=$errors['password_again'];?></div>
			<div class="instruction" id="password_again-instruction">Повторите введенный ранее пароль</div>
		</div>
		<div class="row">
			<!-- Кнопка отправки данных формы -->
			<input type="submit" name="submit" id="btn-submit" value="Зарегистрироваться" />
			
			<!-- Кнопка сброса полей формы к исходному состоянию -->
			<input type="reset" name="reset" id="btn-reset" value="Очистить" />
		</div>
	</form>
</body>
</html>

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

Нам нужно, чтобы поля логина и пароля не были пустыми. Затем необходимо проверить логин на соответствие требованиям. Пароль также должен соответствовать описанным требованиям, а повторно указанный пароль должен с ним совпадать и, кроме того, они должны быть идентичны. Если какое-то из этих условий не выполняется, обработка данных формы должна быть прекращена, в массив сообщений об ошибке должно быть записано соответствующее оповещение, и оно должно быть отображено пользователю. Для удобства пользователя мы сохраним введенный им логин (если он его указал), записав его значение в массив $fields.

Если всё нормально, в окне вашего браузера, обратившись к документу registration.php, вы должны увидеть примерно такую форму:

Теперь, допустим, пользователь нажал на кнопку регистрации, не заполнил поля формы. Согласно нашему алгоритму, логин и пароль не могут быть пустыми. Если это условие не выполняется, регистрация невозможно. Мы помним о том, что обработка данных формы происходит в текущем сценарии. Значит нам нужно изменить его код, добавив соответствующие проверки. Сразу же оговорим и следующие проверки. Если введены и логин, и пароль, нужно проверить их соответствие указанным требованиям. Для проверки логина и пароля мы создадим пользовательские функции в файле functions.php.


/**
  * functions.php
  * Файл с пользовательскими функциями
  */
  
// Подключаем файл с параметрами подключения к СУБД
require_once('database.php');

// Проверка имени пользователя
function checkLogin($str) {
	// Инициализируем переменную с возможным сообщением об ошибке
	$error = '';
	
	// Если отсутствует строка с логином, возвращаем сообщение об ошибке
	if(!$str) {
		$error = 'Вы не ввели имя пользователя';
		return $error;
	}
	
	/**
	  * Проверяем имя пользователя с помощью регулярных выражений
	  * Логин должен быть не короче 4, не длиннее 16 символов
	  * В нем должны быть символы латинского алфавита, цифры, 
	  * в нем могут быть символы '_', '-', '.'
	  */
	$pattern = '/^[-_.a-z\d]{4,16}$/i';	
	$result = preg_match($pattern, $str);
	
	// Если проверка не прошла, возвращаем сообщение об ошибке
	if(!$result) {
		$error = 'Недопустимые символы в имени пользователя или имя пользователя слишком короткое (длинное)';
		return $error;
	}
	
	// Если же всё нормально, вернем значение true
	return true;
}

// Проверка пароля пользователя
function checkPassword($str) {
	// Инициализируем переменную с возможным сообщением об ошибке
	$error = '';
	
	// Если отсутствует строка с логином, возвращаем сообщение об ошибке
	if(!$str) {
		$error = 'Вы не ввели пароль';
		return $error;
	}
	
	/**
	  * Проверяем пароль пользователя с помощью регулярных выражений
	  * Пароль должен быть не короче 6, не длиннее 16 символов
	  * В нем должны быть символы латинского алфавита, цифры, 
	  * в нем могут быть символы '_', '!', '(', ')'
	  */
	$pattern = '/^[_!)(.a-z\d]{6,16}$/i';	
	$result = preg_match($pattern, $str);
	
	// Если проверка не прошла, возвращаем сообщение об ошибке
	if(!$result) {
		$error = 'Недопустимые символы в пароле пользователя или пароль слишком короткий (длинный)';
		return $error;
	}
	
	// Если же всё нормально, вернем значение true
	return true;
}

Теперь нам нужно изменить файл registration.php, чтобы задействовать объявленные нами функции. В сценарий мы добавим условие, проверяющее нажатие кнопки регистрации. Внутри этого условия запускается проверка логина и паролей. В случае, если какая-то из проверок завершается неудачей, мы вновь отображаем форму, и выводим сообщение об ошибке. Если ошибок нет, мы регистрируем пользователя, форму регистрации при этом уже не отображаем, сообщаем пользователю об успешной регистрации, и с помощью функции header() переадресовываем его к форме авторизации.


<?
/**
  * registration.php
  * Страница регистрации пользователей. Предполагается, что в вашей
  * базе данных присутствует таблица пользователей users, в которой
  * есть поля id, login, password, reg_date
  */
  
// Подключаем файл с пользовательскими функциями
require_once('functions.php');

// Инициализируем переменные для введенных значений и возможных ошибок
$errors = array();
$fields = array();

// Заранее инициализируем переменную регистрации, присваивая ей ложное значение
$reg = false;

// Если была нажата кнопка регистрации
if(isset($_POST['submit'])) {
	// Делаем массив сообщений об ошибках пустым
	$errors['login'] = $errors['password'] = $errors['password_again'] = '';
	
	// С помощью стандартной функции trim() удалим лишние пробелы
	// из введенных пользователем данных
	$fields['login'] = trim($_POST['login']);
	$password = trim($_POST['password']);
	$password_again = trim($_POST['password_again']);
	
	// Если логин не пройдет проверку, будет сообщение об ошибке
	$errors['login'] = checkLogin($fields['login']) === true ? '' : checkLogin($fields['login']);
	
	// Если пароль не пройдет проверку, будет сообщение об ошибке
	$errors['password'] = checkPassword($password) === true ? '' : checkPassword($password);
	
	// Если пароль введен верно, но пароли не идентичны, будет сообщение об ошибке
	$errors['password_again'] = (checkPassword($password) === true && $password === $password_again) ? '' : 'Введенные пароли не совпадают';
	
	// Если ошибок нет, нам нужно добавить информацию о пользователе в БД
	if($errors['login'] == '' && $errors['password'] == '' && $errors['password_again'] == '') {
		// Вызываем функцию регистрации, её результат записываем в переменную
		$reg = registration($fields['login'], $password);
		
		// Если регистрация прошла успешно, сообщаем об этом пользователю
		// И создаем заголовок страницы, который выполнит переадресацию к форме авторизации
		if($reg === true) {
			$message = '<p>Вы успешно зарегистрировались в системе. Сейчас вы будете переадресованы к странице авторизации. Если это не произошло, перейдите на неё по <a href="login.php">прямой ссылке</a>.</p>';
			header('Refresh: 5; URL = login.php');
		}
		// Иначе сообщаем пользователю об ошибке
		else {
			$errors['full_error'] = $reg;
		}
	}
}

?>
<html>
<head>
	<title>Регистрация пользователей</title>
	<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
	<form action="" method="post">
		<div class="row">
			<label for="login">Укажите ваш логин:</label>
			<input type="text" class="text" name="login" id="login" value="<?=$fields['login'];?>" />
			<div class="error" id="login-error"><?=$errors['login'];?></div>
			<div class="instruction" id="login-instruction">В имени пользователя могут быть только символы латинского алфавита, цифры, символы '_', '-', '.'. Длина имени пользователя должна быть не короче 4 символов и не длиннее 16 символов</div>
		</div>
		<div class="row">
			<label for="password">Напишите ваш пароль:</label>
			<input type="password" class="text" name="password" id="password" value="" />
			<div class="error" id="password-error"><?=$errors['password'];?></div>
			<div class="instruction" id="password-instruction">В пароле вы можете использовать только символы латинского алфавита, цифры, символы '_', '!', '(', ')'. Пароль должен быть не короче 6 символов и не длиннее 16 символов</div>
		</div>
		<div class="row">
			<label for="password_again">Повторите введенный пароль:</label>
			<input type="password" class="text" name="password_again" id="password_again" value="" />
			<div class="error" id="password_again-error"><?=$errors['password_again'];?></div>
			<div class="instruction" id="password_again-instruction">Повторите введенный ранее пароль</div>
		</div>
		<div class="row">
			<!-- Кнопка отправки данных формы -->
			<input type="submit" name="submit" id="btn-submit" value="Зарегистрироваться" />
			
			<!-- Кнопка сброса полей формы к исходному состоянию -->
			<input type="reset" name="reset" id="btn-reset" value="Очистить" />
		</div>
	</form>
</body>
</html>

В скрипте вы должны были заметить еще одну новую функцию —registration(). А мы её еще не объявляли. Давайте сделаем это.


// Функция регистрации пользователя
function registration($login, $password) {
	// Инициализируем переменную с возможным сообщением об ошибке
	$error = '';
	
	// Если отсутствует строка с логином, возвращаем сообщение об ошибке
	if(!$login) {
		$error = 'Не указан логин';
		return $error;
	} 
	elseif(!$password) {
		$error = 'Не указан пароль';
		return $error;
	}
	
	// Проверяем не зарегистрирован ли уже пользователь
	// Подключаемся к СУБД
	connect();
	
	// Пишем строку запроса
	$sql = "SELECT `id` FROM `users` WHERE `login`='" . $login . "'";
	// Делаем запрос к базе
	$query = mysql_query($sql) or die("<p>Невозможно выполнить запрос: " . mysql_error() . ". Ошибка произошла в строке " . __LINE__ . "</p>");
	// Смотрим на количество пользователей с таким логином, если есть хоть один,
	// возвращаем сообщение об ошибке
	if(mysql_num_rows($query) > 0) {
		$error = 'Пользователь с указанным логином уже зарегистрирован';
		return $error;
	}
	
	// Если такого пользователя нет, регистрируем его
	// Пишем строку запроса
	$sql = "INSERT INTO `users` 
			(`id`,`login`,`password`) VALUES 
			(NULL, '" . $login . "','" . $password . "')";
	// Делаем запрос к базе
	$query = mysql_query($sql) or die("<p>Невозможно добавить пользователя: " . mysql_error() . ". Ошибка произошла в строке " . __LINE__ . "</p>");
	
	// Не забываем отключиться от СУБД
	mysql_close();
	
	// Возвращаем значение true, сообщающее об успешной регистрации пользователя
	return true;
}

Если всё нормально, ваш пользователь будет зарегистрирован. Можете потестировать форму. Попробуйте зарегистрировать пользователей с одинаковыми логинами. После успешной регистрации пользователь будет переадресован к форме авторизации. Ранее мы просто создали разметку для отображения этой формы. Так как в её атрибуте action не указан никакой параметр, данные, отправленные формой, будут обрабатываться в этом же сценарии. Значит нам нужно написать код для обработки, и добавить его в документ login.php.


<?
/**
  * Страница авторизации пользователей. Предполагается, 
  * что в вашей базе данных присутствует таблица users,
  * в которой существуют поля id, login и password
  */
// Подлючаем файл с пользовательскими функциями
require_once('functions.php');

// Заранее инициализируем переменную авторизации, присвоив ей ложное значение
$auth = false;

// Если была нажата кнопка авторизации
if(isset($_POST['submit'])) {
	// Делаем массив сообщений об ошибках пустым
	$errors['login'] = $errors['password'] = $errors['password_again'] = '';
	
	// С помощью стандартной функции trim() удалим лишние пробелы
	// из введенных пользователем данных
	$login = trim($_POST['login']);
	$password = trim($_POST['password']);
	
	// Авторизуем пользователя
	// Вызываем функцию регистрации, её результат записываем в переменную
	$auth = authorization($login, $password);
	
	// Если авторизация прошла успешно, сообщаем об этом пользователю
	// И создаем заголовок страницы, который выполнит переадресацию на защищенную
	// от общего доступа страницу
	if($auth === true) {
		$message = '<p>Вы успешно авторизовались в системе. Сейчас вы будете переадресованы на главную страницу сайта. Если это не произошло, перейдите на неё по <a href="/">прямой&nbsp;ссылке</a>.</p>';
		header('Refresh: 5; URL = /');
	}
	// Иначе сообщаем пользователю об ошибке
	else {
		$errors['full_error'] = $auth;
	}
}
?>
<html>
<head>
	<title>Авторизация пользователей</title>
	<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
	<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<?
// Если запущен процесс авторизации, но она не была успешной,
// или же авторизация еще не запущена, отображаем форму авторизации
if($auth !== true) {
?>
	<!-- Блок для вывода сообщений об ошибках -->
	<div id="full_error" class="error" style="display:
	<?
	echo $errors['full_error'] ? 'inline-block' : 'none';
	?>
	;">
	<?
	// Выводим сообщение об ошибке, если оно есть
	echo $errors['full_error'] ? $errors['full_error'] : '';
	?>
	</div>
	<form action="" method="post">
		<div class="row">
			<label for="login">Ваш логин:</label>
			<input type="text" class="text" name="login" id="login" />
		</div>
		<div class="row">
			<label for="password">Ваш пароль:</label>
			<input type="password" class="text" name="password" id="password" />
		</div>
		<div class="row">
			<input type="submit" name="submit" id="btn-submit" value="Авторизоваться" />
		</div>
	</form>
	<p class="to_reg">Если вы не зарегистрированы в системе, <a href="registration.php">зарегистрируйтесь</a>.</p>
<?
}	// Закрывающая фигурная скобка условного оператора проверки успешной авторизации
// Иначе выводим сообщение об успешной авторизации
else {
	print $message;
}

/**
  * Если всё правильно, будет выведено сообщение об успешной авторизации,
  * пользователь будет переадресован на защищенную страницу
  */
?>
</body>
</html>

Вы, наверное, заметили, что в скрипте авторизации у нас появилась ещё одна незнакомая функция — authorization(). Эта функция должна авторизовать пользователя, предварительно проверив, существует ли в базе данных зарегистрированный пользователь с таким логином и паролем. Если такой пользователь не будет найден, авторизация будет прервана, на экран будет выведено сообщение о неудаче. При успешной проверки функция authorization() запустит сессию, и запишет в неё значения логина и пароля пользователя, сообщит сценарию об успешности авторизации, и сценарий перенаправит пользователя на защищенную страницу ресурса.


/**
  * Функция авторизации пользователя.
  * Авторизация пользователей у нас будет осуществляться
  * с помощью сессий PHP.
  */
function authorization($login, $password) {
	// Инициализируем переменную с возможным сообщением об ошибке
	$error = '';
	
	// Если отсутствует строка с логином, возвращаем сообщение об ошибке
	if(!$login) {
		$error = 'Не указан логин';
		return $error;
	} 
	elseif(!$password) {
		$error = 'Не указан пароль';
		return $error;
	}
	
	// Проверяем не зарегистрирован ли уже пользователь
	// Подключаемся к СУБД
	connect();
	
	// Нам нужно проверить, есть ли такой пользователь среди зарегистрированных
	// Составляем строку запроса
	$sql = "SELECT `id` FROM `users` WHERE `login`='".$login."' AND `password`='".$password."'";
	// Выполняем запрос
	$query = mysql_query($sql) or die("<p>Невозможно выполнить запрос: " . mysql_error() . ". Ошибка произошла в строке " . __LINE__ . "</p>");
	
	// Если пользователя с такими данными нет, возвращаем сообщение об ошибке
	if(mysql_num_rows($query) == 0)	{
		$error = 'Пользователь с указанными данными не зарегистрирован';
		return $error;
	}
	
	// Если пользователь существует, запускаем сессию
	session_start();
	// И записываем в неё логин и пароль пользователя
	// Для этого мы используем суперглобальный массив $_SESSION
	$_SESSION['login'] = $login;
	$_SESSION['password'] = $password;
	
	// Не забываем закрывать соединение с базой данных
	mysql_close();

	// Возвращаем true для сообщения об успешной авторизации пользователя
	return true;
}

Когда пользователь попадает на защищенную страницу, следует проверить корректность данных о его авторизации. Для этого нам потребуется еще одна пользовательская функция. Назовем её checkAuth(). Её задачей будет сверка данных авторизации пользователя с теми, которые хранятся в нашей базе. Если данные не совпадут, пользователь будет перенаправлен на страницу авторизации.


function checkAuth($login, $password) {
	// Если нет логина или пароля, возвращаем false
	if(!$login || !$password)	return false;
	
	// Проверяем зарегистрирован ли такой пользователь
	// Подключаемся к СУБД
	connect();
	
	// Составляем строку запроса
	$sql = "SELECT `id` FROM `users` WHERE `login`='".$login."' AND `password`='".$password."'";
	// Выполняем запрос
	$query = mysql_query($sql) or die("<p>Невозможно выполнить запрос: " . mysql_error() . ". Ошибка произошла в строке " . __LINE__ . "</p>");
	
	// Если пользователя с такими данными нет, возвращаем false;
	if(mysql_num_rows($query) == 0)	{
		return false;
	}

	// Не забываем закрывать соединение с базой данных
	mysql_close();	

	// Иначе возвращаем true
	return true;
}

Теперь, когда пользователь попал на защищенную страницу, мы должны вызвать функцию проверки данных авторизации. Сценарий вызова и проверки мы поместим в отдельный файл checkAuth.php и будем подключать его к тем страницам, которые будут закрытыми для общего доступа.


/**
  * Скрипт проверки авторизации пользователей
  */

// Запускаем сессию, из которой будем извлекать логин и пароль
// авторизовавшихся пользователей
session_start();
  
// Подлючаем файл с пользовательскими функциями
require_once('functions.php');

/**
  * Чтобы определить авторизован ли пользователь, нам нужно 
  * проверить существуют ли в базе данных записи для его логина
  * и пароля. Для этого воспользуемся пользовательской функцией
  * проверки корректности данных авторизовавшегося пользователя.
  * Если эта функция вернет false, значит авторизации нет. 
  * При отсутствии авторизации мы просто переадресовываем 
  * пользователя к странице авторизации.
  */

// Если в сессии присуствуют данные и о логине, и о пароле,
// проверяем их
if(isset($_SESSION['login']) && $_SESSION['login'] && isset($_SESSION['password']) && $_SESSION['password']) {
	// Если проверка существующих данных завершается неудачей
	if(!checkAuth($_SESSION['login'], $_SESSION['password'])) {
		// Переадресовываем пользователя на страницу авторизации
		header('location: login.php');
		// Прекращаем выполнение скрипта
		exit;
	}
}
// Если данных либо о логине, либо о пароле пользователя нет,
// считаем что авторизации нет, переадресовываем пользователя
// на страницу авторизации
else {
	header('location: login.php');
	// Прекращаем выполнение сценария
	exit;
}

А теперь давайте создадим код нашей защищенной страницы. Он будет довольно-таки прост.


<?
/**
  * Защищенная страница. К ней возможен доступ только авторизованным
  * пользователям. Если пользователь не авторизован, ему предлагается 
  * авторизоваться, и доступ к сайту ограничивается. 
  */
require_once('checkAuth.php');
?>
<html>
<head>
	<title>Авторизация и регистрация пользователей</title>
</head>
<body>
<h1>Успешная авторизация.</h1>
<p>Вы получили доступ к защищенной странице. Вы можете <a href="logout.php">выйти</a> из системы.</p>
</body>
</html>

Как видите, в защищенном документе мы подключаем только один файл — checkAuth.php. Все остальные файлы подключаются уже в других сценариях. Поэтому наш код не выглядит громоздким. Регистрацию и авторизацию пользователей мы организовали. Теперь необходимо позволить пользователям выходить из системы. Для этого мы создадим сценарий в файле logout.php.


/**
  * Скрипт выхода пользователя из системы. Так как пользователи
  * авторизуются через сессии, их логин и пароль хранятся
  * в суперглобаном массиве $_SESSION. Чтобы осуществить
  * выход из системы, достаточно просто уничтожить значения
  * массива $_SESSION['login'] и $_SESSION['password'], после
  * чего мы переадресовываем пользователя к странице авторизации
  */

// Обязательно запускаем сессию
session_start();

unset($_SESSION['login']);
unset($_SESSION['password']);
header('location: login.php');

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

P.S. Я в курсе, что лучше писать объектно-ориентированный код, знаю, что передавать и хранить пароль в открытом виде не стоит, что информацию, заносимую в базу данных, необходимо предварительно проверять. Знаю. Об этом я здесь не буду говорить.

  • Я опубликовал эту статью:01.08.2013
  • 98 034
  • Яндекс.Метрика

Меню сайта

Settings

Performance

CPU Load
60%
CPU Temparature
42°
RAM Usage
6,532 MB

Customer care

Reports

Projects

May 14, 2020

Upcoming events

12:00

Donec laoreet fringilla justo a pellentesque

13:20

Nunc quis massa nec enim

14:00

Praesent sit amet